DataSource 的理解

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值