数据库连接池---------------也优化了代码
一、编写数据库连接池
·实现javax.sql.DataSource接口,有getConnection()和getConnection(String username,String password)
·实现DataSource接口。并实现连接池功能的步骤:
1、在DataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedLIist对象中
2、实现getConnection方法,让getConnection方法每次调用时,从LinkedList中区一个Connection返回给用户
3、当用户使用完Connection,调用Connection close()方法时,从LinkedList中Connection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库
注意:linkedlist是链表式的能保证数据库连接池在用完之后返回到linedlist中
而arraylist是线性的不能由以上功能
二、开源数据库连接池
现在很多web服务器都实现了DataSource的实现,及数据库的实现。
也有一些开源组织提供了数据源的独立实现:
·DBCP数据库连接池
·c3p0数据库连接池
实际应用时不需要编写连接数据路代码,直接从数据源获得数据路的连接。程序员编程时也应该尽量使用这些数据源的实现,以提升程序的数据库访问性能。
三、DBCP数据源
1、赋值jar包以及jdbc.properties文件
2、修改配置文件
3、修改DBManager文件
4、该数据库连接池既可以与应用服务器整合使用,也可有应用程序独立使用
四、jdbc与 c3p0的区别
jdbc没有自动回收空闲连接的功能,c3p0有回收空闲连接的功能
五、配置Tomcat数据源
1、设置配置文件
方法一:这种方法并不好
在tomcat服务器的server.xml文件中国的host中加入<context>…..</context>
方法二:常用
在web工程中添加context.txt
<Context>
<Resource name="jdbc/jdbc"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/jdbc"
username="root"
password="123"
maxActive="50"
maxIdle="10"/>
</Context>
六、jdni技术
·即java命名和目录接口,对应于j2se中的javax.naning包
·这套api的主要作用在于:他可以把java对象放在一个容器中(jdni容器),并为容器中的对象起一个名子,以后程序想获得java对象,只需要通过名称检索即可。
·其核心api为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。
以下是编写jdbc框架--------------------优化代码
七、元数据—DataBaseMetaData
·元数据:数据库、表、列的定义信息
·Connection.getDatabaseMetaData对象
• getURL():返回一个String类对象,代表数据库的URL。
• getUserName():返回连接当前数据库管理系统的用户名。
• getDatabaseProductName():返回数据库的产品名称。
• getDatabaseProductVersion():返回数据库的版本号。
• getDriverName():返回驱动驱动程序的名称。
• getDriverVersion():返回驱动程序的版本号。
• isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
八、元数据—PrarameterMetaData
PreparedStatement . getParameterMetaData()
获得代表PreparedStatement元数据的ParameterMetaData对象。
Select * from user where name=? And password=?
ParameterMetaData对象
getParameterCount()
获得指定参数的个数
getParameterType(intparam)
获得指定参数的sql类型
九、元数据—ResultSetMetaData
·ResultSet. getMetaData()
获得代表ResultSet对象元数据的ResultSetMetaData对象。
·ResultSetMetaData对象
getColumnCount()
返回resultset对象的列数
getColumnName(intcolumn)
获得指定列的名称
getColumnTypeName(intcolumn)
获得指定列的类型
十、使用元数据简化JDBC代码
·业务背景:系统中所有实体对象都涉及到基本的CRUD操作:
a)所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句。
b)实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。