Java JDBC 数据源
数据源有2种:
- 普通数据源 即数据库驱动自带的数据源
- 连接池 包括数据库驱动自带的连接池,以及dbcp、c3p0等常用的第三方连接池。
数据库驱动自带的数据源
1 //从properties文件加载数据源配置 2 properties properties = new properties(); 3 inputstream is = class.forname("test.test").getresourceasstream("/mysqldatasource.properties"); 4 properties.load(is); 5 string url=properties.getproperty("url"); 6 string user = properties.getproperty("user"); 7 string password = properties.getproperty("password"); 8 9 //设置普通数据源,因为使用的是mysqldatasource类,驱动自然只能是mysql的驱动,这个类已经把数据库驱动设置好了,不用我们设置。 10 mysqldatasource mysqldatasource = new mysqldatasource(); 11 mysqldatasource.seturl(url); //还有个方法seturl(),这2个方法完全一样,因为seturl()的函数体就是调用seturl() 12 mysqldatasource.setuser(user); 13 mysqldatasource.setpassword(password); 14 15 //获取连接,操作数据库 16 connection connection = mysqldatasource.getconnection(); 17 string sql = "insert into student_tb (name,age,score) values (?,?,?)"; 18 preparedstatement preparedstatement = connection.preparestatement(sql); 19 preparedstatement.setstring(1,"chy"); 20 preparedstatement.setint(2,20); 21 preparedstatement.setint(3,100); 22 preparedstatement.executeupdate(); 23 preparedstatement.close(); 24 connection.close();
我导入的是mysql的数据库驱动,mysql驱动提供的自然是mysql数据源,已经默认注册了mysql数据库驱动,我们不必手动注册。如果导入的其他数据库的驱动,提供的自然就是该种数据库的数据源。
一般来说,数据库驱动都会提供2种数据源:普通数据源、连接池。
mysql驱动提供的普通数据源是mysqldatasource,连接池是mysqlconnectionpooldatasource,看名字就知道是连接池数据源。
数据库驱动自带的连接池
1 //从properties文件加载数据源配置 2 properties properties = new properties(); 3 inputstream is = class.forname("test.test").getresourceasstream("/mysqldatasource.properties"); 4 properties.load(is); 5 string url=properties.getproperty("url"); 6 string user = properties.getproperty("user"); 7 string password = properties.getproperty("password"); 8 9 //设置连接池 10 mysqlconnectionpooldatasource pooldatasource = new mysqlconnectionpooldatasource(); 11 pooldatasource.seturl(url); 12 pooldatasource.setuser(user); 13 pooldatasource.setpassword(password); 14 15 //获取连接,操作数据库 16 connection connection = pooldatasource.getconnection(); 17 string sql = "insert into student_tb (name,age,score) values (?,?,?)"; 18 preparedstatement ps = connection.preparestatement(sql); 19 ps.setstring(1,"chy"); 20 ps.setint(2,20); 21 ps.setint(3,99); 22 ps.executeupdate(); 23 connection.close();
普通数据源采用直连数据库的方式,调用 getconnection() 获取连接时,实际上底层仍是调用 drivermanager.getconnection(url, user, password); 来获取连接;关闭连接时,就是实实在在地关闭连接,释放资源。
连接池是在服务器上创建一个连接池,预先建立一些数据库连接,放在连接池中,调用 getconnection() 获取连接时,只是从连接池中取出一个连接,调用close()关闭连接时,并不是真的关闭连接,是由连接池回收连接,下次还可以接着用。创建数据库连接是很花时间的,使用连接池减少了时间开销。
数据源适合需要多次创建数据库连接的应用,如果不使用数据源,一个一个地drivermanager.getconnection(url, user, password);传入url、user、password创建连接,很麻烦。
连接池数据源适合需要创建多个连接的应用。
dbcp数据源
dbcp是apache的一个开源项目,tomcat的连接池就是使用dbcp来实现的。
使用dbcp需要2个jar包:
- commons-dbcp.jar dbcp的核心包,下载压缩包后里面有
- commons-pool.jar dbcp的依赖,需要单独去下载
这2个都是在apache上下载,下载的时候要注意对应我们的jdk版本(实际上是对应jdk中jdbc的版本)。
此外,还需要2个额外的jar包:
- commons-logging.jar 日志包
- 数据库驱动
dbcp常用的数据源类是basicdatasource。
1 //从properties文件加载数据源配置 2 properties properties = new properties(); 3 inputstream is = class.forname("test.test").getresourceasstream("/datasource.properties"); 4 properties.load(is); 5 string driverstr = properties.getproperty("driver"); 6 string url=properties.getproperty("url"); 7 string username = properties.getproperty("username"); 8 string password = properties.getproperty("password"); 9 10 //设置连接池 11 basicdatasource datasource = new basicdatasource(); 12 //这些第三方的数据源不知道我们使用的是何种数据库,所以要手动设置数据库驱动 13 datasource.setdriverclassname(driverstr); //注意是setdriverclassname(),参数才是string 14 /* 15 也可以这样写: 16 java.sql.driver driver = drivermanager.getdriver(driverstr); 17 datasource.setdriver(driver); //参数是java.sql.driver 18 driver类在多个包下都有,注意不要写错了。 19 建议使用前一种,更简单,不容易出错。 20 */ 21 datasource.seturl(url); 22 datasource.setusername(username); //注意是setusername(),不是setuser() 23 datasource.setpassword(password); 24 25 //从数据源获取连接获取连接,操作数据库 26 connection connection = datasource.getconnection(); 27 string sql = "insert into student_tb (name,age,score) values (?,?,?)"; 28 preparedstatement ps = connection.preparestatement(sql); 29 ps.setstring(1,"chy"); 30 ps.setint(2,20); 31 ps.setint(3,99); 32 ps.executeupdate(); 33 connection.close();
可以通过工厂来创建数据源:
basicdatasource datasource= basicdatasourcefactory.createdatasource(properties); //参数是properties类型
十分简便,但对properties中的key有严格要求,比如说:
setusername() => 去掉set,后面部分变为camel写法,username。
如果key写错了,比如写成了user,会报错: access denied for user ''@'localhost' (using password: yes) ,有时候报的是no。
可以给数据源设置一些其他参数,比如:
datasource.setinitialsize(5); //设置初始连接数,初始化连接池时会创建5个连接,放到连接池中 datasource.setminidle(2); //设置最小空闲连接数,连接池中至少有2个连接是空闲的。idle,闲置的、无所事事。 datasource.setmaxtotal(20); //设置最大连接数,连接池中最多可以有20个连接 //......
c3p0数据源
c3p0是mchange的开源项目,相比于dbcp,c3p0有自动回收闲置连接的功能,性能更优。
下载,解压后lib文件夹下有3个jar包,把c3p0.jar、mchange-commons-java.jar这2个jar包添加到项目中,带oracle的那个是oracel才用的。
把数据库驱动添加到项目中。
dbcp是apache的,要添加自家的日志包commons-logging.jar,c3p0则不必添加日志包。
c3p0常用的数据源类是combopooleddatasource。
1 //从properties文件加载数据源配置 2 properties properties = new properties(); 3 inputstream is = class.forname("test.test2").getresourceasstream("/datasource.properties"); 4 properties.load(is); 5 string driver = properties.getproperty("driver"); 6 string jdbcurl=properties.getproperty("jdbcurl"); 7 string user = properties.getproperty("user"); 8 string password = properties.getproperty("password"); 9 10 //配置数据源 11 combopooleddatasource datasource = new combopooleddatasource(); 12 datasource.setdriverclass(driver); //只有这个方法,没有setdriver() 13 datasource.setjdbcurl(jdbcurl); //注意是setjdbcurl(),和其他数据源不同 14 datasource.setuser(user); 15 datasource.setpassword(password); 16 17 //从数据源获取连接,操作数据库 18 connection connection = datasource.getconnection(); 19 string sql = "insert into student_tb (name,age,score) values (?,?,?)"; 20 preparedstatement ps = connection.preparestatement(sql); 21 ps.setstring(1,"chy"); 22 ps.setint(2,20); 23 ps.setint(3,99); 24 ps.executeupdate(); 25 connection.close();
相比于dbcp,c3p0可以设置更多的配置参数,比如:
datasource.setmaxstatements(10); datasource.setmaxstatementsperconnection(10);
dbcp不具备自动回收空闲连接的功能,c3p0具备。