想把Mybatis的数据源换成tomcat jdbc Pool,spring整合mybatis那篇分析了Mybatis解析配置过程,要整合其他的DataSource可以想到是要分析解析DataSource配置的部分,下面是部分源码
XMLConfigBuilder.java
1 private DataSourceFactory dataSourceElement(XNode context) throwsException {2 if (context != null) {3 String type = context.getStringAttribute("type");4 Properties props =context.getChildrenAsProperties();5 DataSourceFactory factory =(DataSourceFactory) resolveClass(type).newInstance();6 factory.setProperties(props);7 returnfactory;8 }9 throw new BuilderException("Environment declaration requires a DataSourceFactory.");10 }
可以看到DataSourceFactory这个接口,是为整合其他的DataSource准备的,
下面是DataSourceFactory接口的源码:
public interfaceDataSourceFactory {voidsetProperties(Properties props);
DataSource getDataSource();
}
setProperties可以看到是解析的时候newInstance后,会将配置的参数作为Properties传入对特定的DataSource进行设置,知道了怎么扩展DataSource,
现在在来看下tomcat jdbc pool的用法,下面是介绍的链接
作为Plain Obj来用的是这一段介绍,可以看到中间对DataSource的设置
1 public classSimplePOJOExample {2
3 public static void main(String[] args) throwsException {4 //DataSource配置开始
5 PoolProperties p = newPoolProperties();6 p.setUrl("jdbc:mysql://localhost:3306/mysql");7 p.setDriverClassName("com.mysql.jdbc.Driver");8 p.setUsername("root");9 p.setPassword("password");10 p.setJmxEnabled(true);11 p.setTestWhileIdle(false);12 p.setTestOnBorrow(true);13 p.setValidationQuery("SELECT 1");14 p.setTestOnReturn(false);15 p.setValidationInterval(30000);16 p.setTimeBetweenEvictionRunsMillis(30000);17 p.setMaxActive(100);18 p.setInitialSize(10);19 p.setMaxWait(10000);20 p.setRemoveAbandonedTimeout(60);21 p.setMinEvictableIdleTimeMillis(30000);22 p.setMinIdle(10);23 p.setLogAbandoned(true);24 p.setRemoveAbandoned(true);25 p.setJdbcInterceptors(26 "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
27 "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");28 DataSource datasource = newDataSource();29 datasource.setPoolProperties(p);30 //dataSource配置结束
31 Connection con = null;32 try{33 con =datasource.getConnection();34 Statement st =con.createStatement();35 ResultSet rs = st.executeQuery("select * from user");36 int cnt = 1;37 while(rs.next()) {38 System.out.println((cnt++)+". Host:" +rs.getString("Host")+
39 " User:"+rs.getString("User")+" Password:"+rs.getString("Password"));40 }41 rs.close();42 st.close();43 } finally{44 if (con!=null) try {con.close();}catch(Exception ignore) {}45 }46 }47
48 }
开始整合测试
先添加tomcat-jdbc的pom依赖,
org.apache.tomcat
tomcat-jdbc
9.0.6
org.apache.tomcat
tomcat-juli
9.0.6
然后写我们自己的DataSourceFactory
1 importjava.util.Properties;2
3 importorg.apache.ibatis.datasource.DataSourceFactory;4
5 importorg.apache.tomcat.jdbc.pool.DataSource;6 importorg.apache.tomcat.jdbc.pool.PoolProperties;7
8 public class TomcatJDBCPoolDataSourceFactory implementsDataSourceFactory {9
10 privateDataSource dataSource;11
12 publicTomcatJDBCPoolDataSourceFactory(){13 dataSource = newDataSource();14 }15 //setProperties 实例化DataSourceFactory后被调用
16 public voidsetProperties(Properties props) {17 PoolProperties p = newPoolProperties();18 //简化测试,开发中要考虑灵活读取配置
19 p.setUrl(props.getProperty("url"));20 p.setDriverClassName(props.getProperty("driver"));21 p.setUsername(props.getProperty("username"));22 p.setPassword(props.getProperty("password"));23 p.setJmxEnabled(false);24 p.setTestWhileIdle(false);25 p.setTestOnBorrow(true);26 p.setValidationQuery("SELECT 1");27 p.setTestOnReturn(false);28 p.setValidationInterval(30000);29 p.setTimeBetweenEvictionRunsMillis(30000);30 p.setMaxActive(100);31 p.setInitialSize(10);32 p.setMaxWait(10000);33 p.setRemoveAbandonedTimeout(60);34 p.setMinEvictableIdleTimeMillis(30000);35 p.setMinIdle(10);36 p.setLogAbandoned(true);37 p.setRemoveAbandoned(true);38 p.setJdbcInterceptors(39 "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
40 "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");41 dataSource.setPoolProperties(p);42
43 }44
45 publicDataSource getDataSource() {46
47 returndataSource;48 }49
50 }
配置Mybatis Config
…………………….…………………….
……………………….
…………………………………………………
我们的测试程序,可以看到测试成功
……………………………….
LogFactory.useLog4JLogging();
String resource= "com/jack/mybatis/learn/mybatis-config.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory= newSqlSessionFactoryBuilder().build(inputStream);
SqlSession session=sqlSessionFactory.openSession();try{
List persons = session.selectList("com.jack.mybatis.learn.PersonMapper.selectPerson", 101);
System.out.println("--------------Select Start---------------");
System.out.println(persons);
System.out.println("--------------Select End---------------");
}finally{
session.close();
}
…………………………………

本文详细介绍了如何将Mybatis的默认数据源替换为Tomcat JDBC Pool,包括解析DataSource配置、理解DataSourceFactory接口,以及实现Tomcat JDBCPoolDataSourceFactory并整合到Spring Mybatis配置中。通过示例展示了如何配置和使用Tomcat JDBCPool,确保了数据源的高效管理和安全性。
302

被折叠的 条评论
为什么被折叠?



