DriverManager 因为不支持数据连接池,所以在应用中一般都使用DataSource.
DataSource 的3种实现:
1.简单的实现,和DriverManager 一样.
2.数据连接池的实现
3.分布式事务的实现,同时也实现数据连接池.
1.简单实现
一般来说数据库供应商提供的jdbc driver 会提供javax.sql.DataSource接口的简单实现类.如mysql 的就是com.mysql.jdbc.jdbc2.optional.MysqlDataSource
下面是一个例子:
MysqlDataSource ds= new MysqlDataSource();//直接创建DataSource 对象,然后设置属性就可以了.
ds.setUser("root");
ds.setPassword("");
ds.setServerName("localhost");
ds.setPort(3306);
// ds.setDatabaseName("tyh_rate");
String sql="insert into user(u_name,password,create_time) values(?,?,?)";
try(Connection con=ds.getConnection()){
con.setCatalog("tyh_rate");
PreparedStatement pstmt=con.prepareStatement(sql);
pstmt.setString(1, "a");
pstmt.setString(2, "123");
pstmt.setDate(3, Date.valueOf("2015-12-04"));
pstmt.executeUpdate();
}
2.使用连接池的 方式.
在mysql 提供的jdbc driver 包下有一个类是:
com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
应该是javax.sql.ConnectionPoolDataSource 的实现类.
注意:
ConnectionPoolDataSource 不是数据库连接池,而是用于生成连接池连接的,这个连接可以被保存在数据库连接池中.
实现这个接口的类将会被DataSource 实现类来使用,并用于生成数据库连接池.
stackflow 有一个相关的解释
个人理解:
HikariCP 这种第三方连接池库就是javax.sql.DataSource 的实现类.
也可以在独立的java 程序中使用数据连接池(without tomcat):
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(5);
config.setJdbcUrl("jdbc:mysql://localhost:3306");
config.setUsername("root");
config.setPassword("");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
HikariDataSource ds = new HikariDataSource(config);
String sql="insert into user(u_name,password,create_time) value(?,?,?)";
try(Connection con=ds.getConnection()){
con.setCatalog("tyh_rate");
PreparedStatement pstmt=con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, "a");
pstmt.setString(2, "123");
pstmt.setDate(3, Date.valueOf("2015-12-04"));
pstmt.executeUpdate();
}
Thread.sleep(10000); //用于暂停jvm,便于查看数据库连接
}
查看主机上的mysql 连接有5条.
sudo netstat -antpul |grep mysql
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 4787/mysqld
tcp 0 0 127.0.0.1:3306 127.0.0.1:51480 ESTABLISHED 4787/mysqld
tcp 0 0 127.0.0.1:3306 127.0.0.1:51477 ESTABLISHED 4787/mysqld
tcp 0 0 127.0.0.1:3306 127.0.0.1:51478 ESTABLISHED 4787/mysqld
tcp 0 0 127.0.0.1:3306 127.0.0.1:51479 ESTABLISHED 4787/mysqld
tcp 0 0 127.0.0.1:3306 127.0.0.1:51481 ESTABLISHED
加深理解
javase/tutorial/jdbc