java--获取数据库连接1(单例)

来源:互联网 发布:人物识别软件 编辑:程序博客网 时间:2024/06/06 07:48

应用程序直接获取链接的缺点:
用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。

package cn.hncu.pubs;import java.sql.Connection;import java.sql.DriverManager;import java.util.Properties;public class ConnFacory {    public static Connection conn;    private ConnFacory(){    }    static{        try {            Properties p=new Properties();            p.load(ConnFacory.class.getClassLoader().getResourceAsStream("jdbc.properties"));            String dirver=p.getProperty("driver");            String url=p.getProperty("url");            String name=p.getProperty("username");            String pwd=p.getProperty("password");            Class.forName(dirver);            conn=DriverManager.getConnection(url, name, pwd);            System.out.println("conn:"+conn);        } catch (Exception e) {            e.printStackTrace();        }    }    public static Connection getConnection(){        return conn;    }}

jdbc.properties

##MySQLdriver=com.mysql.jdbc.Driverurl=jdbc:mysql://127.0.0.1:3306/hncu?useUnicode=true&characterEncoding=utf-8username=rootpassword=1234size=3##Oracle#driver=oracle.jdbc.driver.OracleDriver#url=jdbc:oracle:thin:@127.0.0.1:1521:orcl#username=scott#password=tiger

演示:

package cn.hncu.tx;import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;import cn.hncu.pubs.ConnFacory;//使用的是单例的连接工厂ConnFactory--不能使用多线程,需要创建多例public class TxDemo {    public static void main(String[] args) throws Exception {        Connection con=ConnFacory.getConnection();        Statement st = con.createStatement();        try {            con.setAutoCommit(false);            st.execute("INSERT INTO person VALUES('P200','赵子龙','1')");            new MyThread(1).start();            new MyThread(2).start();            new MyThread(3).start();            new MyThread(4).start();            new MyThread(5).start();            Thread.sleep(1000);            con.commit();//因为是单线程共用一个con,提交事务其他线程(用户)就不能再使用            System.out.println("main线程提交一个事务....");        } catch (Exception e) {            con.rollback();            System.out.println("main线程回滚一个事务.....");        }finally{//          con.setAutoCommit(true);//因为是单线程共用一个con,如果关了事物其他线程(用户)就不能使用//          con.close();//因为是单线程共用一个con,如果关了连接其他线程(用户)就不能使用        }    }}class MyThread extends Thread{    private int num;    public MyThread(int num){        this.num = num;    }    @Override    public void run() {        Connection con=ConnFacory.getConnection();        try {            Statement st = con.createStatement();            con.setAutoCommit(false);            String sql = "INSERT INTO person VALUES('P09"+num+"','赵子龙','1')";            if(num==3){                sql = "INSERT INTO person VALUES('P092','赵子龙','1')";            }else{                Thread.sleep(100);            }            st.executeUpdate(sql);            con.commit();//因为是单线程共用一个con,提交事务其他线程(用户)就不能再使用            System.out.println(num+"线程提交一个事务....");        } catch (Exception e) {            try {                con.rollback();                System.out.println(num+"线程回滚一个事务.....");            } catch (SQLException e1) {                e1.printStackTrace();            }        }finally{//          try {//              con.setAutoCommit(true);//因为是单线程共用一个con,如果关了事物其他线程(用户)就不能使用//              con.close();//因为是单线程共用一个con,如果关了连接其他线程(用户)就不能使用//          } catch (SQLException e) {//              e.printStackTrace();//          }    }    }}
1 0