目录
数据库连接
连接数据库的常用方式:
- 建立JDBC-ODBC桥接器
- 加载Java数据库驱动程序
1、应用程序加载驱动程序
SQL Server
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Oracle
Class.forName("oracle.jdbc.driver.OracleDriver");
MySql
Class.forName("com.mysql.jdbc.Driver");
2、建立连接
SQl Server
String uri="jdbc:sqlserver://192.168.100.1:1433;DataBaseName=Warehouse";
String user="sa";
String password="sa";
Connection conn=DriverManager.getConnection(uri,user,password);
Oracle
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@主机号:端口号(默认1521):数据库名","用户名","密码");
MySQL
Connection conn=DriverManager.getConnection("jdbc:mysql://主机号:端口号(默认3306)/数据库名","用户名","密码");
3、创建Statement对象执行Sql语句
Statement stat=con.createStatement();
stat.executeUpdate(SQL语句);
stat.executeQuery(SQL查询语句);
executeUpdate()返回受影响的行数,executeQuery()返回ResultSet对象
String query="select name from authors";
try(ResultSet rs=stat.executeQuery(query)){
while(rs.next()){//必须使用next()移动到第一行,且没有hasNext()语句
authors.add(rs.getString(1));//与数组下标不同,索引从1开始,即第一列
}
}
4、预备语句PreparedStatement(继承于Statement接口),每个宿主变量用“?”表示,如果存在一个一个以上的变量,值和‘?’的位置必须一一对应
String query="select name from authors where ID=? and salary=?";
PreparedStatement stat=conn.preparStatement(query);
stat.setString(1,"1011");//位置序号从1开始,且与参数类型一致
stat.setInt(2,200);
stat.executeQuery();
关于Statement和PreparedStatement的具体实现可以参考另一篇博客: http://blog.csdn.net/aimomo007/article/details/77609325
5、调用语句CallableStatement(继承于PreparedStatement接口) 用于执行SQL存储过程
如果使用结果参数,则必须将其注册为OUT参数,参数从1开始编号
CallableStatement proc=null;
String sql="{call PKG_CURSOR.SP_PAGE(?,?,?,?,?,?)}";
proc=conn.preparedCall(sql);
//IN OUT参数
proc.setInt(1,10);
proc.registerOutParameter(1,OracleTypes.INTEGER);
//IN OUT参数
proc.setInt(2,6);
proc.registerOutParameter(2,OracleTypes.INTEGER);
//IN参数
proc.setString(3,"select * from EMPLOYEES");
//OUT参数
proc.registerOutParameter(4,OracleTypes.INTEGER);
proc.registerOutParameter(5,OracleTypes.INTEGER);
proc.registerOutParameter(6,OracleTypes.CURSOR);
proc.execute();
int pages=((CallableStatement)proc).getInt(4);
int rows=((CallableStatement)proc).getInt(5);
Result rs=((CallableStatement)proc).getCursor(6);
while(rs.next()){...}
6、事物
setAutoCommit(boolean b) true:自动提交,即任何一个SQL的操作立即生效
commit() 提交
rollback() 回滚
数据库连接池(基础现实步骤)
以空间换时间
背景:
1.频繁的进行数据库的连接和释放操作会极大的降低系统的性能,增大系统的开销。
2.如果出现程序异常而导致某些连接未能正常关闭,将引起系统的内存泄漏。
连接池的建立:
在应用程序开始时,建立一个静态连接池,即初始化时就已经分配好,且不能随意关闭。Java中提供了很多容器可以很方便的构建连接池,例如,Stack,Vector。通过读取连接属性文件Connections.properties与数据库实例建立连接。
连接池的管理:不同的数据库连接池有不同的管理策略,下面介绍的是采用引用计数的方式管理连接池,后面还会介绍目前使用过得一些成熟的连接池框架,比如C3p0、Druid。
引用计数
当客户请求数据库连接时,首先查看连接池中是否存在空闲连接。如果存在空闲连接,则把该连接分配给用户并将该链接标识为正在使用同时引用计数器加1。如果不存在,则查看当前所开的连接数是否超过
maxConn(最大连接数)。如果未超过,则新建立一个连接给用户,如果超过则按照
maxWaitTime(最大等待时间进行等待),如果等待maxWaitTime后还是没有空闲连接则抛出无空闲连接的异常给用户。
当客户是否数据库连接时,首先判断该连接的引用计数是否超过给定值,如果超过就删除该连接,并判断当前所开的连接数是否小于
minConn(最小连接数),如果小于,则将连接池充满,如果没有超过给定值,就将该连接标记为空闲连接,可供再次复用。
连接池的关闭:
当应用程序退出时,关闭连接池,此时要关闭连接池中的所有数据库连接。
连接池的配置:
数据库连接池中到底要放多少个连接才能使系统的性能更佳,用minConn和maxConn限制。
minConn是应用程序启动时所创建的连接数,如果过大,启动将变慢,但启动后响应速度变快。如果过小,启动将变快,但是最初使用的用户因为没有足够的连接而执行缓慢。
可以通过反复试验来确定最大饱和度,为此在连接池类中提供了两个方法getActiveSize()和getOpenSize(),
ActiveSize是某一时间有多少个连接正在被使用,
OpenSize是连接池中有多少连接被打开。
minConn
ActiveSize
关于C3P0连接池可以参考另外一篇博客: http://blog.csdn.net/aimomo007/article/details/78865238
关于Druid连接池可以参考另外一篇博客:待更新
事务处理:
1.Connection本身提供了对事物的支持,可以通过将AutoCommit设置为false,显示的调用commit和rollback。
2.连接池提供了显示的事物开始,结束声明和一个事物注册表,用于登记事物发起者和连接的对应关系,事物使用的连接在该事物运行中不能被复用。当事物结束时,从注册表中删除相应表项。