解决思路
实际上Jodd已经提供这种需求的接口,ConnectionProvider
, 我们只需要实现这个接口就可以了 下面以国产的优秀的连接池#Druid#为例
首先,实现接口
文件 webit/db/connection/DruidConnectionProvider.java
<!-- lang: java -->
package webit.db.connection;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import java.util.Properties;
import jodd.db.DbSqlException;
import jodd.db.connection.ConnectionProvider;
import jodd.util.PropertiesUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author zqq90
*/
public class DruidConnectionProvider implements ConnectionProvider {
private final static String DRUID_PROPS_FILE = "/druid.properties"; //这里是默认加载的配置文件
private DruidDataSource ds;
@Override
public void init() {
Properties properties = PropertiesUtil.createFromClasspath(DRUID_PROPS_FILE);
try {
ds = createDataSource(properties);
} catch (Exception ex) {
throw new DbSqlException(ex);
}
}
@Override
public Connection getConnection() {
try {
return ds.getConnection();
} catch (SQLException ex) {
throw new DbSqlException(ex);
}
}
@Override
public void closeConnection(Connection cnctn) {
try {
//不用担心,这里不是真正的关闭链接,在Druid里实际上是回收了链接
cnctn.close();
} catch (SQLException ex) {
throw new DbSqlException(ex);
}
}
@Override
public void close() {
ds.close();
}
private static DruidDataSource createDataSource(Properties properties) throws Exception {
DruidDataSource dataSource = new DruidDataSource();
DruidDataSourceFactory.config(dataSource, (Map) properties);
return dataSource;
}
}
是的,额外的Java代码只需这么多
Druid 配置
本实例设置的配置文件是 /druid.properties
url=jdbc:......
username=root
password=***
initialSize=1
minIdle=1
maxActive=20
其他设置请参考 druid 官方文档
最后一步,该怎么使用呢?
在程序启动的时候
<!-- lang: java -->
// 初始化连接源
ConnectionProvider connectionProvider= new DruidConnectionProvider();
connectionProvider.init();
//把 connectionProvider 设置成默认的连接源
DbManager.getInstance().setConnectionProvider(connectionProvider);
或者自己管理DbSession
<!-- lang: java -->
public DbSession getSession() {
//注意: 传入已经初始化的connectionProvider
return new DbSession(connectionProvider);
}