由于最近网站一直出现Connection cannot open的问题,所以决定更换默认的Hibernate数据源。
方式有很多,可以考虑Hibernate推荐的连接池c3p0或者proxool,虽然dbcp也比较有名,但由hiberater已不对其进行支持所以也没有考虑,据说是因为Bug太多,具体也没去验证。
首先尝试了proxool,配置好后Connection cannot open的问题的确解决,但是proxool对spring的支持貌似存在一些问题,一些int型的参数不能在spring中注入。
配置文件如下:
<bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="driverUrl" value="jdbc:mysql://localhost:3306/test?user=msyql &password=pwd&characterEncoding=UTF-8 &zeroDateTimeBehavior=convertToNull" /> <property name="user" value="mysql" /> <property name="password" value="pwd" /> <property name="alias" value="test" /> <property name="houseKeepingTestSql" value="select CURRENT_DATE" /> </bean>
如果设置了maxConnection这些int型的参数spring会报类型转换错误,为了通过检测所以都删掉了,但这样的配置不会有很好的效果。
经过一些考虑,用第三方的数据源,不如使用jboss自带的连接池,所以开始配置jndi:
配置步骤如下:
1、拷贝$JBOSS_HOME/docs/examples/jca/mysql-ds.xml到$JBOSS_HOME/server/default/deploy/mysql-ds.xml
由于我是用的是mysql数据库,所以拷贝了mysql-ds.xml,其他数据库拷贝对应的文件。
2、拷贝好文件后对mysql-ds.xml进行配置,方法比较简单,这里就不贴代码了。
但配置中加了几个元素
<min-pool-size>5</min-pool-size> 最小连接数
<max-pool-size>100</max-pool-size> 最大连接数
3、拷贝mysql驱动到jboss的lib下,否则启动加载时会报错
4、修改spring配置文件
由于spring提供了对jndi的支持,所以配置比较简单,但是实现的类要写对。代码如下:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="java:/MySqlDS"/> <property name="lookupOnStartup" value="true"/> </bean>
这里的jndiName要和mysql-ds.xml中配置的jndiName对应,但是名字前要加上java:/
到这里配置基本结束了,启动jboss看是否运行正常。
如果命令行中输出了:
Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=MySqlDS' to JNDI name 'java:MySqlDS'
则说明jboss已经找到了这个jndi,但是意外的是spring在bind这个jndi的时候却抛出了MySqlDS没有找到的异常。
尝试按照完善的方法尝试了多个jndi的别名都无效,如MySqlDS 、java:MySqlDS 、java:comp/env/MySqlDS。
最后,只能先尝试在mysql-ds.xml中加入
<use-java-context>false</use-java-context> 这个参数默认为true,设置为false后可以使用MySqlDS直接访问 JNDI,所以再修改spring配置文件为
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="MySqlDS"/> <property name="lookupOnStartup" value="true"/> </bean
这种方法的确可行。
但还是没有找到为什么不能用java:/MySqlDS的原因,而且<use-java-context>false</use-java-context>存在着一定的安全隐患。所以我们来看看为什么使用java:/MySqlDS无法绑定。
经过了一系列的折腾,最后发现竟然是一个jboss-archive-browsing.jar的包造成的,所以删掉lib中的这个包后就能正常用java:/MySqlDS访问了。
希望对网上有同样问题的朋友有所帮助。