您的位置:首页 > 数据库 > MySQL

DataSource 的理解

2015-12-02 19:44 651 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql