Skip to content

Datasource

Calvin edited this page Jul 2, 2013 · 16 revisions

1. Apache Commons DBCP

老牌DataSource用惯了。 一般配置如下,高级配置看DBCP自带文档

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
			<!-- Connection Info -->
			<property name="driverClassName" value="${jdbc.driver}" />
			<property name="url" value="${jdbc.url}" />
			<property name="username" value="${jdbc.username}" />
			<property name="password" value="${jdbc.password}" />
		
			<!-- Connection Pooling Info -->
			<property name="maxActive" value="${dbcp.maxActive}" />
			<property name="maxIdle" value="${dbcp.maxIdle}" />
			<property name="defaultAutoCommit" value="false" />
			<!-- 连接Idle一个小时后超时 -->
			<property name="timeBetweenEvictionRunsMillis" value="3600000" />
			<property name="minEvictableIdleTimeMillis" value="3600000" />
		</bean>

defaultAutoCommit=false是必须设置的,否则事务好像会不灵光。maxActive和maxIdle如果不想依赖默认值还是自己设置一下好。最后是Idle长时间后要主动断掉连接,否则MySQL下会出问题。

bean定义里的destroy-method="close"也很重要。

2. Spring DataSource

在某些场合,简简单单不想使用连接池也不想引入依赖包,可以直接使用Spring自带的DataSource--SimpleDriverDataSource(替代了以前的与OSGI的ClassLoader不兼容的DriverManagerDataSource。)

	<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
		<property name="driverClass" value="${jdbc.driver}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>

3. Log4jdbc显示SQL

想看实际产生的SQL,最简单的方法是在applicationContext.xml的entityManagerFactory的配置中,增加

<prop key="hibernate.show_sql">true</prop>

但hibernate自己的showsql看不到绑定的参数。如果要想看到实际执行的sql和实际绑定的参数,可以使用log4jdbc。 log4jdbc一共有三个分支,log4jdbc是原版,最讨厌的地方是不在Maven主仓库中,替代品之一log4jdbc-remix,但版本数太低也停止更新了,SpringSide最新采用的是前两者的继承者log4jdbc-log4j2,JDK6用jdbc4.0版本,JDK7就用4.1。

支持SQL打印的步骤如下:

  1. 打开application.properties里在原来的jdbc url的中间加上"log4jdbc",如
jdbc.url=jdbc:log4jdbc:h2:file:~/.h2/quickstart;AUTO_SERVER=TRUE
  1. log4jdbc-log4j2可输出到slf4j 或者log4j2,需要在resources里增加一个文件log4jdbc.log4j2.properties,并编写如下内容指定用slf4j,这是个新增的配置项:
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

3.设置Logger,需要设置jdbc.sqltiming=INFO,连SQL带执行时间打印出来,如果只想看sql是jdbc.sqlonly=INFO,在logback.xml里如下:

<logger name="jdbc.sqltiming" level="INFO"/>

4.(可选)参照log4jdbc-log4j2的文档,在log4jdbc.log4j2.properties文件中配置其他的log4jdbc参数。\

  • log4jdbc.debug.stack.prefix,只显示调用栈的包名吻合正则表达式的语句。
  • log4jdbc.sqltiming.warn.threshold,执行时间阀值,单位为ms,将Log级别调为Warning,则只会打印执行较慢的语句。
  • log4jdbc.dump.sql.select/insert/update/delete, 过滤掉某些类型的语句。

返回参考手册