简述jdbc为什么要使用连接池

简述jdbc为什么要使用连接池,第1张

JDBC访问一般分为如下流程:1、加载JDBC驱动程序:在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(StringclassName)实现。例如:try{//加载MySql的驱动类Class.forName("com.mysql.jdbc.Driver")}catch(ClassNotFoundExceptione){System.out.println("找不到驱动程序类,加载驱动失败!")e.printStackTrace()}成功加载后,会将Driver类的实例注册到DriverManager类中。2、提供JDBC连接的URL连接URL定义了连接数据库时的协议、子协议、数据源标识。书写形式:协议:子协议:数据源标识协议:在JDBC中总是以jdbc开始子协议:是桥连接的驱动程序或是数据库管理系统名称。数据源标识:标记找到数据库来源的地址与连接端口。例如:(MySql的连接URL)jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=gbkuseUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为gb2312或GBK,本参数必须设置为true。characterEncoding=gbk:字符编码方式。3、创建数据库的连接要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。使用DriverManager的getConnectin(Stringurl,Stringusername,Stringpassword)方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。例如://连接MySql数据库,用户名和密码都是rootStringurl="jdbc:mysql://localhost:3306/test"Stringusername="root"Stringpassword="root"try{Connectioncon=DriverManager.getConnection(url,username,password)}catch(SQLExceptionse){System.out.println("数据库连接失败!")se.printStackTrace()}4、创建一个Statement要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3种类型:1、执行静态SQL语句。通常通过Statement实例实现。2、执行动态SQL语句。通常通过PreparedStatement实例实现。3、执行数据库存储过程。通常通过CallableStatement实例实现。具体的实现方式:Statementstmt=con.createStatement()PreparedStatementpstmt=con.prepareStatement(sql)CallableStatementcstmt=con.prepareCall("{CALLdemoSp(?,?)}")5、执行SQL语句Statement接口提供了三种执行SQL语句的方法:executeQuery、executeUpdate和execute1、ResultSetexecuteQuery(StringsqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。2、intexecuteUpdate(StringsqlString):用于执行INSERT、UPDATE或DELETE语句以及SQLDDL语句,如:CREATETABLE和DROPTABLE等3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。具体实现的代码:ResultSetrs=stmt.executeQuery("SELECT*FROM")introws=stmt.executeUpdate("INSERTINTO")booleanflag=stmt.execute(Stringsql)6、处理结果两种情况:1、执行更新返回的是本次 *** 作影响到的记录数。2、执行查询返回的结果是一个ResultSet对象。ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些行中数据的访问。使用结果集(ResultSet)对象的访问方法获取数据:while(rs.next()){Stringname=rs.getString("name")Stringpass=rs.getString(1)//此方法比较高效(列是从左到右编号的,并且从列1开始)}7、关闭JDBC对象 *** 作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:1、关闭记录集2、关闭声明3、关闭连接对象if(rs!=null){//关闭记录集try{rs.close()}catch(SQLExceptione){e.printStackTrace()}}if(stmt!=null){//关闭声明try{stmt.close()}catch(SQLExceptione){e.printStackTrace()}}if(conn!=null){//关闭连接对象try{conn.close()}catch(SQLExceptione){e.printStackTrace()}}

你指的是JDBC连接池连接超时失效问题的问题吧?

这是因为mysql默认保持连接的时间是8小时,如果这个连接在8小时内无人访问的话,就会关闭这个连接。但是连接池设计的时候没有考虑到这个问题,还把失效的连接拿出去就会导致出现异常。

解决方法:

1、创建一个线程每隔一段时间就测试一下连接,保持连接时最新的,永远达不到8小时无人访问。

2、连接池取连接的时候判定是否这个连接有效。

[java] view plain copy

if (conn.isValid(1000)){

return conn

}

else{

return this.CreateConnection()

}

3、不使用连接池,直接拿了就用,用了就还。

连接池的概念:

用池来管理Connection,这可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。

JDBC数据库连接池接口(DataSource):

Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商可以让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!

1.可以

2.可以

3.如果都用一个Connection,并发怎么办,事物怎么处理?

4.同上

5.(DBCP,C3P0)只是连接池,关闭连接是在程序中控制的。如果是用spring是在请求结束时spring自动关闭的。

6.不是,连接池的作用就是close连接是不close物理连接。

7.连接池是web应用层面东西。在Web服务器都关了,连接池就没有了啊。

8.同上。

9.“关闭全部连接”有语义歧义。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6422863.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-21
下一篇 2023-03-21

发表评论

登录后才能评论

评论列表(0条)

保存