`
zuzong
  • 浏览: 112412 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

在iBatis中加入c3p0数据库连接池

    博客分类:
  • java
阅读更多
我看论坛里有两个人写了在iBatis中加入c3p0,我也就不跟着掺合了,做这个的原因是没法用spring,又需要连接池,且对DBCP一直观感不加,没法,只好自己动手了

在iBatis中加入c3p0没啥难技术含量,写个文章备份下

首先打开iBatis的源码包,找到com.ibatis.sqlmap.engine.datasource包,在里面新建个类
C3p0DataSourceFactory,并实现DataSourceFactory接口,里面的代码是
	private DataSource dataSource;
	
	public DataSource getDataSource() {
		return dataSource;
	}

	public void initialize(Map map) {
		C3p0Configuration c3p0 = new C3p0Configuration(map);
	    dataSource = c3p0.getDataSource();
	}


然后到com.ibatis.common.jdbc包里,新建类C3p0Configuration,里面的代码是。。。太长了,先给个片段,具体的下载附件吧,原来在dbcp那部分里,还有单独加载配置文件的方法,我觉得如果连这个xml都读不了,那别的一样没法读
	private static final Probe PROBE = ProbeFactory.getProbe();
	private DataSource dataSource;

	/**
	 * Constructor to supply a map of properties
	 * 
	 * @param properties
	 *            - the map of configuration properties
	 */
	public C3p0Configuration(Map properties) {
		try {
			dataSource = legacyC3p0Configuration(properties);
		} catch (Exception e) {
			throw new RuntimeException(
					"Error initializing C3p0DataSourceFactory.  Cause: " + e, e);
		}
	}

	/**
	 * Getter for DataSource
	 * 
	 * @return The DataSource
	 */
	public DataSource getDataSource() {
		return dataSource;
	}

	private boolean notEmpty(String s) {
		return s != null && s.length() > 0;
	}

	private boolean notSelfString(String s, String compareStr) {
		return !s.equalsIgnoreCase(compareStr);
	}

	private DataSource legacyC3p0Configuration(Map map) {

		ComboPooledDataSource combo = null;

		try {
			if (map.containsKey("JDBC.Driver")) {

				combo = new ComboPooledDataSource();

				String driverClass = (String) map.get("JDBC.Driver");
				String jdbcUrl = (String) map.get("JDBC.ConnectionURL");
				String user = (String) map.get("JDBC.Username");
				String password = (String) map.get("JDBC.Password");

				Class.forName(driverClass);
				combo.setDriverClass(driverClass);
				combo.setJdbcUrl(jdbcUrl);
				combo.setUser(user);
				combo.setPassword(password);

				String acquireIncrement = (String) map
						.get("Pool.acquireIncrement");
				if (notEmpty(acquireIncrement)
						&& notSelfString(acquireIncrement, "acquireIncrement"))
					combo.setAcquireIncrement(Integer
							.parseInt(acquireIncrement));

......................


最后在com.ibatis.sqlmap.engine.config包里,找到SqlMapConfiguration,在里面找到,加上C3P0就好了
    // DATA SOURCE ALIASES
    typeHandlerFactory.putTypeAlias("SIMPLE", SimpleDataSourceFactory.class.getName());
    typeHandlerFactory.putTypeAlias("DBCP", DbcpDataSourceFactory.class.getName());
    typeHandlerFactory.putTypeAlias("C3P0", C3p0DataSourceFactory.class.getName());
    typeHandlerFactory.putTypeAlias("JNDI", JndiDataSourceFactory.class.getName());



具体的源码看附件吧,文件名是“iBatis添加c3p0.rar”里面有c3p0-config.properties和SqlMapConfig.xml

还有打包好的ibatis jar,在附件里,名字是ibatis-2.3.4.726-c3p0.jar
2
0
分享到:
评论
3 楼 zuzong 2009-06-13  
补遗:

private boolean notSelfString(String s, String compareStr) { 
        return !s.equalsIgnoreCase(compareStr); 
    }

原来在ibatis的DBCP里,没这项判断,但我测试时发现,如果在SqlMapConfig.xml里,
类似这项
<property name="Pool.description" value="${description}"/>

当${description}是空值时,就会直接传入EL里面的字符串description

所以,如果EL式里面的字符串变了,这个判断就没治了。。。
2 楼 shunzheheliu 2009-06-13  
木用过ibatis还有c3p0,非常纯洁的顶【支持】一下
1 楼 孙宁振 2009-06-13  
木用过ibatis,纯洁的支持一下

相关推荐

Global site tag (gtag.js) - Google Analytics