jdbc pool java连接池技术



1.ConnectPool .java:  
2.  
3.  package pool;  
4.  
5./** 
6. * Title: ConnectPool.Java 
7. * Description: 连接池治理器 
8. * Copyright: Copyright (c) 2002/12/25 
9. * Company: 
10. * Author : 
11. * Version 2.0 
12. */  
13.  
14.import java.io.*;  
15.import java.sql.*;  
16.import java.util.*;  
17.import java.util.Date;  
18.  
19./** 
20. * 治理类DBConnectionManager支持对一个或多个由属性文件定义的数据库连接 
21. * 池的访问.客户程序可以调用getInstance()方法访问本类的唯一实例. 
22. */  
23.public class ConnectPool {  
24.    static public ConnectPool instance; // 唯一实例  
25.    static public int clients;  
26.    public Vector drivers = new Vector(); //驱动  
27.    public PrintWriter log;  
28.    public Hashtable pools = new Hashtable(); //连接  
29.  
30.    /** 
31.     * 返回唯一实例.假如是第一次调用此方法,则创建实例 
32.     * 
33.     * @return DBConnectionManager 唯一实例 
34.     */  
35.    static synchronized public ConnectPool getInstance() {  
36.        if (instance == null) {  
37.            instance = new ConnectPool();  
38.        }  
39.  
40.        clients++;  
41.        return instance;  
42.    }  
43.  
44.    /** 
45.     * 返回唯一实例.假如是第一次调用此方法,则创建实例 
46.     * 
47.     * @return DBConnectionManager 唯一实例 
48.     */  
49.    static synchronized public ConnectPool getInstance(String url) {  
50.        if (instance == null) {  
51.            instance = new ConnectPool(url);  
52.        }  
53.        clients++;  
54.        return instance;  
55.    }  
56.  
57.  
58.    /** 
59.     * 建构函数私有以防止其它对象创建本类实例 
60.     */  
61.    public ConnectPool() {  
62.        init();  
63.    }  
64.  
65.    /** 
66.     * 建构造带参数的函数 
67.     * 
68.     */  
69.    public ConnectPool(String url) {  
70.        init(url);  
71.    }  
72.  
73.    /** 
74.     * 将连接对象返回给由名字指定的连接池 
75.     * 
76.     * @param name 在属性文件中定义的连接池名字 
77.     * @param con 连接对象 
78.     */  
79.    public void freeConnection(String name, Connection con) {  
80.        DBConnectionPool pool = (DBConnectionPool) pools.get(name);  
81.        if (pool != null) {  
82.            pool.freeConnection(con);  
83.        } else {  
84.            // System.out.println("pool ==null");  
85.        }  
86.        clients--;  
87.    }  
88.  
89.    /** 
90.     * 获得一个可用的(空闲的)连接.假如没有可用连接,且已有连接数小于最大连接数 
91.     * 限制,则创建并返回新连接 
92.     * 
93.     * @param name 在属性文件中定义的连接池名字 
94.     * @return Connection 可用连接或null 
95.     */  
96.    public Connection getConnection(String name) {  
97.        DBConnectionPool pool = (DBConnectionPool) pools.get(name);  
98.        if (pool != null) {  
99.            //return pool.getConnection();  
100.            return pool.returnConnection();  
101.        }  
102.        return null;  
103.    }  
104.  
105.    /** 
106.     * 获得一个可用连接.若没有可用连接,且已有连接数小于最大连接数限制, 
107.     * 则创建并返回新连接.否则,在指定的时间内等待其它线程释放连接. 
108.     * 
109.     * @param name 连接池名字 
110.     * @param time 以毫秒计的等待时间 
111.     * @return Connection 可用连接或null 
112.     */  
113.    public Connection getConnection(String name, long time) {  
114.        DBConnectionPool pool = (DBConnectionPool) pools.get(name);  
115.        if (pool != null) {  
116.            return pool.getConnection(time);  
117.        }  
118.        return null;  
119.    }  
120.  
121.    /** 
122.     * 关闭所有连接,撤销驱动程序的注册 
123.     */  
124.    public synchronized void release() {  
125.// 等待直到最后一个客户程序调用  
126.        if (--clients != 0) {  
127.            return;  
128.        }  
129.  
130.        Enumeration allPools = pools.elements();  
131.        while (allPools.hasMoreElements()) {  
132.            DBConnectionPool pool = (DBConnectionPool) allPools.nextElement();  
133.            pool.release();  
134.        }  
135.        Enumeration allDrivers = drivers.elements();  
136.        while (allDrivers.hasMoreElements()) {  
137.            Driver driver = (Driver) allDrivers.nextElement();  
138.            try {  
139.                DriverManager.deregisterDriver(driver);  
140.  
141.                log("撤销JDBC驱动程序 " + driver.getClass().getName() + "的注册");  
142.            } catch (SQLException e) {  
143.                log(e, "无法撤销下列JDBC驱动程序的注册: " + driver.getClass().getName());  
144.            }  
145.        }  
146.    }  
147.  
148.    /** 
149.     * 根据指定属性创建连接池实例. 
150.     * 
151.     * @param props 连接池属性 
152.     */  
153.    private void createPools(Properties props) {  
154.        Enumeration propNames = props.propertyNames();  
155.        while (propNames.hasMoreElements()) {  
156.            String name = (String) propNames.nextElement();  
157.            if (name.endsWith(".url")) {  
158.                String poolName = name.substring(0, name.lastIndexOf("."));  
159.                String url = props.getProperty(poolName + ".url");  
160.                if (url == null) {  
161.                    log("没有为连接池" + poolName + "指定URL");  
162.                    continue;  
163.                }  
164.                String user = props.getProperty(poolName + ".user");  
165.                String passWord = props.getProperty(poolName + ".password");  
166.                String maxconn = props.getProperty(poolName + ".maxconn", "0");  
167.                int max;  
168.                try {  
169.                    max = Integer.valueOf(maxconn).intValue();  
170.                } catch (NumberFormatException e) {  
171.                    log("错误的最大连接数限制: " + maxconn + " .连接池: " + poolName);  
172.                    max = 0;  
173.                }  
174.                DBConnectionPool pool = new DBConnectionPool(poolName, url,  
175.                        user, passWord, max);  
176.                pools.put(poolName, pool);  
177.                log("成功创建连接池" + poolName);  
178.            }  
179.        }  
180.    }  
181.  
182.    /** 
183.     * 读取属性完成初始化 
184.     */  
185.    private void init() {  
186.        try {  
187.            Properties p = new Properties();  
188.            String configs = System.getProperty("user.dir") + "//conf//poolName.properties";  
189.            //String configs = System.getProperty("user.dir") + "//conf//poolName.properties";  
190.  
191.            //System.out.println("configs file local at " + configs);  
192.            FileInputStream is = new FileInputStream(configs);  
193.            Properties dbProps = new Properties();  
194.            try {  
195.                dbProps.load(is);  
196.            } catch (Exception e) {  
197.                System.err.println("不能读取属性文件. " +  
198.                                   "请确保db.properties在CLASSPATH指定的路径中");  
199.                return;  
200.            }  
201.            String logFile = dbProps.getProperty("logfile",  
202.                                                 "DBConnectionManager.log");  
203.            try {  
204.  
205.                log = new PrintWriter(new FileWriter(logFile, true), true);  
206.            } catch (IOException e) {  
207.                System.err.println("无法打开日志文件: " + logFile);  
208.                log = new PrintWriter(System.err);  
209.            }  
210.            loadDrivers(dbProps);  
211.            createPools(dbProps);  
212.        } catch (Exception e) {}  
213.    }  
214.  
215.    /** 
216.     * 读取属性完成初始化 
217.     */  
218.    private void init(String url) {  
219.        try {  
220.            Properties p = new Properties();  
221.            String configs = System.getProperty("user.dir") +  
222.                             "//conf//"+url;  
223.            //System.out.println("configs file local at " + configs);  
224.            FileInputStream is = new FileInputStream(configs);  
225.            Properties dbProps = new Properties();  
226.            try {  
227.                dbProps.load(is);  
228.            } catch (Exception e) {  
229.                System.err.println("不能读取属性文件. " +  
230.                                   "请确保db.properties在CLASSPATH指定的路径中");  
231.                return;  
232.            }  
233.            String logFile = dbProps.getProperty("logfile",  
234.                                                 "DBConnectionManager.log");  
235.            try {  
236.  
237.                log = new PrintWriter(new FileWriter(logFile, true), true);  
238.            } catch (IOException e) {  
239.                System.err.println("无法打开日志文件: " + logFile);  
240.                log = new PrintWriter(System.err);  
241.            }  
242.            loadDrivers(dbProps);  
243.            createPools(dbProps);  
244.        } catch (Exception e) {}  
245.    }  
246.  
247.  
248.    /** 
249.     171 * 装载和注册所有JDBC驱动程序 
250.     172 * 
251.     173 * @param props 属性 
252.     174 */  
253.    private void loadDrivers(Properties props) {  
254.        String driverClasses = props.getProperty("drivers");  
255.        StringTokenizer st = new StringTokenizer(driverClasses);  
256.        while (st.hasMoreElements()) {  
257.            String driverClassName = st.nextToken().trim();  
258.            try {  
259.                Driver driver = (Driver)  
260.                                Class.forName(driverClassName).newInstance();  
261.                DriverManager.registerDriver(driver);  
262.                drivers.addElement(driver);  
263.                //System.out.println(driverClassName);  
264.                log("成功注册JDBC驱动程序" + driverClassName);  
265.            } catch (Exception e) {  
266.                log("无法注册JDBC驱动程序: " +  
267.                    driverClassName + ", 错误: " + e);  
268.            }  
269.        }  
270.    }  
271.  
272.    /** 
273.     * 将文本信息写入日志文件 
274.     */  
275.    private void log(String msg) {  
276.        log.println(new Date() + ": " + msg);  
277.    }  
278.  
279.    /** 
280.     * 将文本信息与异常写入日志文件 
281.     */  
282.    private void log(Throwable e, String msg) {  
283.        log.println(new Date() + ": " + msg);  
284.        e.printStackTrace(log);  
285.    }  
286.  
287.    /** 
288.     * 此内部类定义了一个连接池.它能够根据要求创建新连接,直到预定的最 
289.     * 大连接数为止.在返回连接给客户程序之前,它能够验证连接的有效性. 
290.     */  
291.  
292.    class DBConnectionPool {  
293.//private int checkedOut;  
294.        private Vector freeConnections = new Vector();  
295.        private int maxConn;  
296.        private String name;  
297.        private String password;  
298.        private String URL;  
299.        private String user;  
300.  
301.        /** 
302.         * 创建新的连接池 
303.         * 
304.         * @param name 连接池名字 
305.         * @param URL 数据库的JDBC URL 
306.         * @param user 数据库帐号,或 null 
307.         * @param password 密码,或 null 
308.         * @param maxConn 此连接池答应建立的最大连接数 
309.         */  
310.        public DBConnectionPool(String name, String URL, String user,  
311.                                String password, int maxConn) {  
312.            this.name = name;  
313.            this.URL = URL;  
314.            this.user = user;  
315.            this.password = password;  
316.            this.maxConn = maxConn;  
317.        }  
318.  
319.        /** 
320.         * 将不再使用的连接返回给连接池 
321.         * 
322.         * @param con 客户程序释放的连接 
323.         */  
324.        public synchronized void freeConnection(Connection con) {  
325.// 将指定连接加入到向量末尾  
326.            try {  
327.                if (con.isClosed()) {  
328.                    //  System.out.println("before freeConnection con is closed");  
329.                }  
330.                freeConnections.addElement(con);  
331.                Connection contest = (Connection) freeConnections.lastElement();  
332.                if (contest.isClosed()) {  
333.                    // System.out.println("after freeConnection contest is closed");  
334.                }  
335.                notifyAll();  
336.            } catch (SQLException e) {  
337.                // System.out.println(e);  
338.            }  
339.        }  
340.  
341.        /** 
342.         * 从连接池获得一个可用连接.如没有空闲的连接且当前连接数小于最大连接 
343.         * 数限制,则创建新连接.如原来登记为可用的连接不再有效,则从向量删除之, 
344.         * 然后递归调用自己以尝试新的可用连接. 
345.         */  
346.        public synchronized Connection getConnection() {  
347.            Connection con = null;  
348.            if (freeConnections.size() > 0) {  
349.// 获取向量中第一个可用连接  
350.                con = (Connection) freeConnections.firstElement();  
351.                freeConnections.removeElementAt(0);  
352.                try {  
353.                    if (con.isClosed()) {  
354.                        log("从连接池" + name + "删除一个无效连接");  
355.                        System.out.println("从连接池" + name + "删除一个无效连接");  
356.// 递归调用自己,尝试再次获取可用连接  
357.                        con = getConnection();  
358.                    }  
359.                } catch (SQLException e) {  
360.                    log("从连接池" + name + "删除一个无效连接时错误");  
361.                    System.out.println("从连接池" + name + "删除一个无效连接出错");  
362.// 递归调用自己,尝试再次获取可用连接  
363.                    con = getConnection();  
364.                }  
365.                if (freeConnections.size() > maxConn) {  
366.                    System.out.println(" 删除一个溢出连接 ");  
367.                    releaseOne();  
368.                }  
369.            } else if ((maxConn == 0) || (freeConnections.size() < maxConn)) {  
370.                con = newConnection();  
371.            }  
372.  
373.            return con;  
374.        }  
375.  
376.        public synchronized Connection returnConnection() {  
377.            Connection con = null;  
378.//假如闲置小于最大连接,返回一个新连接  
379.            if (freeConnections.size() < maxConn) {  
380.                con = newConnection();  
381.            }  
382.//假如闲置大于最大连接,返回一个可用的旧连接  
383.            else if (freeConnections.size() >= maxConn) {  
384.  
385.                con = (Connection) freeConnections.firstElement();  
386.                System.out.println(" [a 连接池可用连接数 ] : " + "[ " +  
387.                                   freeConnections.size() + " ]");  
388.                freeConnections.removeElementAt(0);  
389.                System.out.println(" [b 连接池可用连接数 ] : " + "[ " +  
390.                                   freeConnections.size() + " ]");  
391.                try {  
392.                    if (con.isClosed()) {  
393.                        log("从连接池" + name + "删除一个无效连接");  
394.                        System.out.println("从连接池" + name + "删除一个无效连接");  
395.                        returnConnection();  
396.                    }  
397.                } catch (SQLException e) {  
398.                    log("从连接池" + name + "删除一个无效连接时错误");  
399.                    System.out.println("从连接池" + name + "删除一个无效连接出错");  
400.                    returnConnection();  
401.                }  
402.            }  
403.            return con;  
404.        }  
405.  
406.        /** 
407.         * 从连接池获取可用连接.可以指定客户程序能够等待的最长时间 
408.         * 参见前一个getConnection()方法. 
409.         * 
410.         * @param timeout 以毫秒计的等待时间限制 
411.         */  
412.        public synchronized Connection getConnection(long timeout) {  
413.            long startTime = new Date().getTime();  
414.            Connection con;  
415.            while ((con = getConnection()) == null) {  
416.                try {  
417.                    wait(timeout);  
418.                } catch (InterruptedException e) {}  
419.                if ((new Date().getTime() - startTime) >= timeout) {  
420.// wait()返回的原因是超时  
421.                    return null;  
422.                }  
423.            }  
424.            return con;  
425.        }  
426.  
427.        /** 
428.         * 关闭所有连接 
429.         */  
430.        public synchronized void release() {  
431.            Enumeration allConnections = freeConnections.elements();  
432.            while (allConnections.hasMoreElements()) {  
433.                Connection con = (Connection) allConnections.nextElement();  
434.                try {  
435.                    con.close();  
436.                    log("关闭连接池" + name + "中的一个连接");  
437.                } catch (SQLException e) {  
438.                    log(e, "无法关闭连接池" + name + "中的连接");  
439.                }  
440.            }  
441.            freeConnections.removeAllElements();  
442.        }  
443.  
444.        /** 
445.         * 关闭一个连接 
446.         */  
447.        public synchronized void releaseOne() {  
448.            if (freeConnections.firstElement() != null) {  
449.                Connection con = (Connection) freeConnections.firstElement();  
450.                try {  
451.                    con.close();  
452.                    System.out.println("关闭连接池" + name + "中的一个连接");  
453.                    log("关闭连接池" + name + "中的一个连接");  
454.                } catch (SQLException e) {  
455.  
456.                    System.out.println("无法关闭连接池" + name + "中的一个连接");  
457.                    log(e, "无法关闭连接池" + name + "中的连接");  
458.                }  
459.            } else {  
460.                System.out.println(  
461.                        "releaseOne() bug.......................................................");  
462.  
463.            }  
464.        }  
465.  
466.        /** 
467.         * 创建新的连接 
468.         */  
469.        private Connection newConnection() {  
470.            Connection con = null;  
471.            try {  
472.                if (user == null) {  
473.                    con = DriverManager.getConnection(URL);  
474.                } else {  
475.                    con = DriverManager.getConnection(URL, user, password);  
476.                }  
477.                log("连接池" + name + "创建一个新的连接");  
478.  
479.            } catch (SQLException e) {  
480.                log(e, "无法创建下列URL的连接: " + URL);  
481.                return null;  
482.            }  
483.            return con;  
484.        }  
485.    }  
486.}  
487.  
488.-----------------------------------------------------------------------------------------------------------------  
489.  
490.PoolMan.java:  
491.  
492.package pool;  
493.  
494./** 
495. * Title: ConnectPool.java 
496. * Description: 数据库操作 
497. * Copyright: Copyright (c) 2002/12/25 
498. * Company: 
499. * Author : 
500. * remark : 加入指针回滚 
501. * Version 2.0 
502. */  
503.  
504.import java.io.*;  
505.import pool.*;  
506.import java.sql.*;  
507.import java.util.*;  
508.import java.util.Date;  
509.import java.net.*;  
510.  
511.public class PoolMan extends ConnectPool {  
512.  
513.    private ConnectPool connMgr;  
514.    private Statement stmt;  
515.    private Connection con;  
516.    private ResultSet rst;  
517.  
518.    /** 
519.     *对象连接初始化 
520.     * */  
521.  
522.    public Connection getPool(String name) throws Exception {  
523.        try {  
524.            connMgr = ConnectPool.getInstance();  
525.            con = connMgr.getConnection(name);  
526.        } catch (Exception e) {  
527.            System.err.println("不能创建连接!请尝试重启应用服务器");  
528.  
529.        }  
530.        return con;  
531.    }  
532.  
533.    /** 
534.     * 2008-10-14 
535.     *对象连接初始化 
536.     * */  
537.  
538.    public Connection getPool(String name,String url) throws Exception {  
539.        try {  
540.            connMgr = ConnectPool.getInstance(url);  
541.            con = connMgr.getConnection(name);  
542.        } catch (Exception e) {  
543.            System.err.println("不能创建连接!请尝试重启应用服务器");  
544.  
545.        }  
546.        return con;  
547.    }  
548.  
549.  
550.    /** 
551.     *同以上方法,加入连接空闲等待时间 
552.     *待用方法 
553.     * */  
554.  
555.    public Connection getPool_t(String name, long time) throws Exception {  
556.        try {  
557.            connMgr = ConnectPool.getInstance();  
558.            con = connMgr.getConnection(name, time);  
559.        } catch (Exception e) {  
560.            System.err.println("不能创建连接!");  
561.  
562.        }  
563.        return con;  
564.    }  
565.  
566.    /** 
567.     *执行查询方法1 
568.     * */  
569.    public ResultSet executeQuery(String SqlStr) throws Exception {  
570.        ResultSet result = null;  
571.        try {  
572.            stmt = con.createStatement();  
573.            result = stmt.executeQuery(SqlStr);  
574.// here add one line by jnma 12.11  
575.            con.commit();  
576.        } catch (java.sql.SQLException e) {  
577.            throw new Exception("执行查询语句出错");  
578.        }  
579.        return result;  
580.    }  
581.  
582.    /** 
583.     *执行查询方法2 
584.     * */  
585.    public ResultSet getRst(String SqlStr) throws Exception {  
586.// ResultSet result = null;  
587.        try {  
588.            stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,  
589.                                       ResultSet.CONCUR_UPDATABLE);  
590.            rst = stmt.executeQuery(SqlStr);  
591.// here add one line by jnma 12.11  
592.            con.commit();  
593.        } catch (java.sql.SQLException e) {  
594.            throw new Exception("执行查询语句出错");  
595.        }  
596.        return rst;  
597.    }  
598.  
599.    /** 
600.     *执行更新 
601.     * */  
602.    public int Update(String SqlStr) throws Exception {  
603.        int result = -1;  
604.        try {  
605.            stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,  
606.                                       ResultSet.CONCUR_UPDATABLE);  
607.            result = stmt.executeUpdate(SqlStr);  
608.// here add one line by jnma 12.11  
609.            con.commit();  
610.            if (result == 0) {  
611.                System.out.println("执行delete,update,insert SQL出错");  
612.            }  
613.        } catch (java.sql.SQLException e) {  
614.            System.err.println("执行delete,update,insert SQL出错");  
615.        }  
616.        return result;  
617.    }  
618.  
619.    /** 
620.     *执行事务处理 
621.     * */  
622.    public boolean handleTransaction(Vector SqlArray) throws Exception {  
623.        boolean result = false;  
624.        int ArraySize = SqlArray.size();  
625.        try {  
626.            stmt = con.createStatement();  
627.            con.setAutoCommit(false);  
628.            System.out.println("ArraySize is" + ArraySize);  
629.            for (int i = 0; i < ArraySize; i++) {  
630.                System.out.println(" 开始执行语句" + (String) SqlArray.elementAt(i));  
631.                stmt.executeUpdate((String) SqlArray.elementAt(i));  
632.                System.out.println(" 执行成功");  
633.            }  
634.            con.commit();  
635.            con.setAutoCommit(true); //必须  
636.            System.out.println("事务执行成功");  
637.            result = true;  
638.        } catch (java.sql.SQLException e) {  
639.            try {  
640.                System.out.println(e.toString());  
641.                System.out.println("数据库操作失败");  
642.                con.rollback();  
643.            } catch (java.sql.SQLException Te) {  
644.                System.err.println("事务出错回滚异常");  
645.            }  
646.        }  
647.        try {  
648.            con.setAutoCommit(true);  
649.        } catch (java.sql.SQLException e) {  
650.            System.err.println("设置自动提交失败");  
651.        }  
652.        return result;  
653.    }  
654.  
655.    /** 
656.     *释放连接 
657.     * */  
658.    public void close(String name) throws Exception {  
659.        try {  
660.            if (stmt != null) {  
661.                stmt.close();  
662.            }  
663.            if (con != null) {  
664.                connMgr.freeConnection(name, con);  
665.  
666.                System.out.println(" [c 正在释放一个连接 ] ");  
667.  
668.            }  
669.        } catch (java.sql.SQLException e) {  
670.            System.err.println("释放连接出错");  
671.        }  
672.    }  
673.  
674.}  
675.  
676.-----------------------------------------------------------------------------------------------------------  
677.  
678.MyDB.java  
679.  
680.   
681.  
682.package db;  
683.  
684.import java.sql.*;  
685.import pool.PoolMan;  
686.import base.Constants;  
687.import java.util.List;  
688.import java.util.ArrayList;  
689.import java.util.HashMap;  
690.import java.util.Iterator;  
691.import org.apache.commons.beanutils.DynaBean;  
692.import org.apache.commons.beanutils.RowSetDynaClass;  
693.import java.util.Vector;  
694.import bean.Log;  
695.import bean.AdminBean;  
696.import base.FunctionStatic;  
697.import forms.system.DeptForm;  
698.import org.apache.commons.beanutils.BeanUtils;  
699.  
700./* 
701.//数据层续承此类包 
702.例如:public class Function extends MyDB {。。。。。。 
703.注意:当调用数据层都必需关闭数据库 
704.Function fun=new Function() 
705.fun.Close 
706.*/  
707.public class MyDB {  
708.    public Connection conn = null;  
709.    public ResultSet rs = null;  
710.    public ResultSet rs1 = null;  
711.    public java.sql.PreparedStatement prepar = null;  
712.    public Statement stmt = null;  
713.    public boolean flag = false;  
714.    public java.sql.CallableStatement proc = null;  
715.    public int pagecount = 0;  
716.    public int pagedata = 0;  
717.    PoolMan PoolMan = new PoolMan();  
718.    public MyDB() {  
719.  
720.        //通过名称得到连接池  
721.        conn = PoolMan.getConnection(Constants.SYSTEM_DB_POOL_NAME);  
722.       //System.out.println("连接成功");  
723.    }  
724.  
725.    //关闭连接  
726.    public void Close() {  
727.        try {  
728.            if (rs != null) {  
729.                rs.close();  
730.            }  
731.            if (rs1 != null) {  
732.                rs1.close();  
733.            }  
734.            if (prepar != null) {  
735.                prepar.close();  
736.            }  
737.            if (proc != null) {  
738.                proc.close();  
739.            }  
740.            if (stmt != null) {  
741.                stmt.close();  
742.            }  
743.            if (conn != null) {  
744.                conn.close();  
745.            }  
746.        } catch (SQLException ex) {  
747.            ex.printStackTrace();  
748.        }  
749.//        System.out.println("关闭成功");  
750.    }  
751.  
752.    public int executeSql(String sql)throws DbAccessException{  
753.        int flag = 0;  
754.        try {  
755.            stmt = conn.createStatement();  
756.            flag = stmt.executeUpdate(sql);  
757.           // return flag;  
758.        } catch (Exception e) {  
759.            throw new DbAccessException("操作数据库出错");  
760.        }finally{  
761.            //return flag;  
762.        }  
763.        return flag;  
764.    }  
765.  
766.    //结果集的数据转存入List  
767.    public List setResultToList(ResultSet rs) {  
768.        List list = new ArrayList();  
769.        try {  
770.            ResultSetMetaData md = rs.getMetaData();  
771.  
772.            /*获取结果集的列数*/  
773.            int columnCount = md.getColumnCount();  
774.            while (rs.next()) {  
775.                HashMap map = new HashMap();  
776.                /*把每一行以(key,value)存入HashMap, 列名做为key,列值做为value */  
777.                for (int i = 1; i <= columnCount; ++i) {  
778.                    String tempStr = rs.getString(i);  
779.                    if (tempStr == null) {  
780.                        tempStr = "";  
781.                    }  
782.                    map.put(md.getColumnName(i), tempStr);  
783.                }  
784.                /*把装有一行数据的HashMap存入list*/  
785.                list.add(map);  
786.            }  
787.        } catch (SQLException ex) {  
788.            ex.printStackTrace();  
789.        }  
790.        //System.out.println(list.size());  
791.        return list;  
792.    }  
793.  
794.    /* 
795.     结果集的数据转存入List  3hsjc 
796. 
797.     selectsql:查询的字段 
798.     wheresql:查询条件的组合语句 
799.     sortsql:排序的组合语句 
800.     PageSize:每页显示的条数 
801.     PageNum:当前条数 
802.     tableName:表名 
803.     keyName:表中的主键字段名 
804. 
805.     页面调查方法: 
806.     <%@page import="java.util.*"%> 
807. 
808.     List list = (List) request.getAttribute("list"); //得到类包里存的值 
809.     if (list!=null){ 
810.       for (int i = 0; i < list.size(); i++) { 
811.          HashMap map = (HashMap) list.get(i); 
812.          System.out.println(map.get("id"));    //字段名同库字段名 
813.       } 
814.     } 
815. 
816.     */  
817.    public List getListByMap(String selectsql, String wheresql, String sortsql,  
818.                          int PageSize, int PageNum, String tableName,  
819.                          String keyName) { //获取 列表信息  
820.        List list = new ArrayList();  
821.  
822.        String sql = "";  
823.        try {  
824.            if ("".equals(selectsql)) {  
825.                selectsql = "*";  
826.            }  
827.            if ("".equals(tableName) || "".equals(keyName)) {  
828.                return null;  
829.            }  
830.            sql = "SELECT top " + PageSize + " " + selectsql + "  FROM " +  
831.                  tableName + " WHERE 1=1 " + wheresql +  
832.                  " and " + keyName + " not in (select top " +  
833.                  PageSize * (PageNum - 1) + " " + keyName + " from " +  
834.                  tableName + " where 1=1 " + wheresql + sortsql + ")" +  
835.                  sortsql + "";  
836.  
837.            System.out.println("sql = " + sql );  
838.            stmt = conn.createStatement();  
839.            rs = stmt.executeQuery(sql);  
840.  
841.            list = this.setResultToList(rs);  
842.            return list;  
843.        } catch (SQLException ex) {  
844.            ex.printStackTrace();  
845.        }  
846.        return null;  
847.    }  
848.  
849.  
850.    /* 
851.     结果集的数据转存入List  3hzyh 
852. 
853.     selectsql:查询的字段 
854.     wheresql:查询条件的组合语句 
855.     sortsql:排序的组合语句 
856.     PageSize:每页显示的条数 
857.     PageNum:当前条数 
858.     tableName:表名 
859.     keyName:表中的主键字段名 
860. 
861.     页面调查方法: 
862.     <%@page import="org.apache.struts.util.RequestUtils"%> 
863.     <%@page import="org.apache.commons.beanutils.*"%> 
864.     <%@page import="java.util.*"%> 
865. 
866.     Vector list = (Vector) request.getAttribute("list"); //得到类包里存的值 
867.     if (list!=null){ 
868.       for (int i = 0; i < list.size(); i++) { 
869.          DynaBean info = (DynaBean) list.get(i); 
870.          System.out.println(BeanUtils.getSimpleProperty(info,"id"));    //字段名全小写 
871.       } 
872.     } 
873. 
874.     */  
875.    public Vector getList(String selectsql, String wheresql, String sortsql,  
876.                          int PageSize, int PageNum, String tableName,  
877.                          String keyName) { //获取 列表信息  
878.        Vector vector = new Vector();  
879.  
880.        String sql = "";  
881.        try {  
882.            if ("".equals(selectsql)) {  
883.                selectsql = "*";  
884.            }  
885.            if ("".equals(tableName) || "".equals(keyName)) {  
886.                return null;  
887.            }  
888.            sql = "SELECT top " + PageSize + " " + selectsql + "  FROM " +  
889.                  tableName + " WHERE 1=1 " + wheresql +  
890.                  " and " + keyName + " not in (select top " +  
891.                  PageSize * (PageNum - 1) + " " + keyName + " from " +  
892.                  tableName + " where 1=1 " + wheresql + sortsql + ")" +  
893.                  sortsql + "";  
894.  
895.            System.out.println(sql);  
896.            stmt = conn.createStatement();  
897.            rs = stmt.executeQuery(sql);  
898.  
899.            /*对查询结果集RS进行行集的转换*/  
900.            RowSetDynaClass rsdc = new RowSetDynaClass(rs);  
901.            /*把行集的每一行另存为LIST,以便存取操作*/  
902.            List rsDynaClass = rsdc.getRows();  
903.  
904.            Iterator itr = rsDynaClass.iterator();  
905.  
906.            int i = 0;  
907.            while (itr.hasNext()) {  
908.                i++;  
909.                /*对LIST的每一行数据,动态生成虚拟BEAN*/  
910.                DynaBean dBean = (DynaBean) itr.next();  
911.                vector.add(dBean);  
912.  
913.            }  
914.            return vector;  
915.        } catch (SQLException ex) {  
916.            ex.printStackTrace();  
917.        }  
918.        return null;  
919.    }  
920.  
921.    //======================================================================  
922.    //Created by linjunna 2009-08-13  
923.    //增加用户操作日志  
924.    /* 
925.    ActionCode: 
926.    1:登录系统 
927.    2:...... 
928.    */  
929.    public boolean InsertLog(Log log) {  
930.        String sql = "INSERT INTO SU_UserLog(userName,note,userAction,ActionCode,dateCreated) VALUES (?,?,?,?,getdate() )";  
931.        int flag=0;  
932.        try {  
933.            prepar = conn.prepareStatement(sql);  
934.            prepar.setString(1, log.getUserName());  
935.            prepar.setString(2, log.getNote());  
936.            prepar.setString(3, log.getUserAction());  
937.            prepar.setString(4, log.getActionCode());  
938.            flag = prepar.executeUpdate();  
939.            if (flag>1) return true;  
940.        } catch (Exception ex) {  
941.        }  
942.        return false;  
943.    }  
944.  
945.    /* 
946.    函数说明:获取表中某一字段的值 
947.    参数说明你个:field:要获取字段的名称;keyName:判断的条件;keyValue:判断的条件的值;tableName:数据库表名 
948.    返回值说明:String 
949.     */  
950.    public String getFieldValue(String field,String keyName,String keyValue,String tableName) {  
951.        String result = "";  
952.        FunctionStatic fun = new FunctionStatic();  
953.        try {  
954.            String sql = " select "+field+" from "+tableName+" where "+keyName+" ='" + keyValue + "' ";  
955.  
956.            prepar = conn.prepareStatement(sql);  
957.            rs = prepar.executeQuery();  
958.            while (rs.next()){  
959.                result = fun.getNullString(rs.getString(field));  
960.                break;  
961.            }  
962.        } catch (Exception e) {  
963.            e.printStackTrace();  
964.        }  
965.        return result;  
966.    }  
967.  
968.  
969.    /* 
970.    函数描述:修改表的某一字段 
971.    */  
972.    public int updateTableField(String TableName, String FieldName,String FieldValue, String PKID) {  
973.        int ret = 0;  
974.        String sql = "update ? set ? = ? where ID=?";  
975.        try {  
976.            prepar = conn.prepareStatement(sql);  
977.            prepar.setString(1, TableName);  
978.            prepar.setString(2, FieldName);  
979.            prepar.setString(3, FieldValue);  
980.            prepar.setString(4, PKID);  
981.  
982.            ret = prepar.executeUpdate(sql);  
983.        } catch (Exception e) {  
984.            e.printStackTrace();  
985.        }  
986.        return ret;  
987.    }  
988.  
989.    /* 
990.      函数说明:批量删除 
991.      参数说明:FieldName:表的字段名;FieldValues:字段值,以逗号分隔,形式如:"h0001,h0002,h0003,..." 
992.      返回值:整数 
993.      */  
994.      public int BatchDeleteByIds( String TableName, String FieldName,String FieldValues)  
995.      {  
996.          String[] strs=base.FunctionStatic.splitSkins(FieldValues,",");  
997.          int flag = strs.length;  
998.          try {  
999.  
1000.              conn.setAutoCommit(false);  
1001.              for (int i=0;i<strs.length;i++)  
1002.              {  
1003.                 flag-= Delete(TableName,FieldName,strs[i]);  
1004.              }  
1005.              conn.commit();  
1006.          } catch (Exception e) {  
1007.              try {  
1008.                  conn.rollback();  
1009.              } catch (SQLException ex) {  
1010.                  ex.printStackTrace();  
1011.              }  
1012.              e.printStackTrace();  
1013.          }  
1014.          if (flag==0)  
1015.              return 1;  
1016.          else  
1017.              return 0;  
1018.  
1019.      }  
1020.  
1021.      /* 
1022.      功能描述:根据表的主键id删除记录 
1023.      参数:TableName为要删除记录的表名;tids为一个或多个主键id字符串,以逗号(,)隔开;AutoCommit为是否使用事务 
1024.      author:曾令启 
1025.      */  
1026.      public int Delete(String TableName, String WhereSQL,boolean AutoCommit) {  
1027.          int flag = 0;  
1028.          try {  
1029.              String sql = "";  
1030.              conn.setAutoCommit(AutoCommit);  
1031.              sql = " delete from " + TableName + " where 1=1 " + WhereSQL + " ";  
1032.              flag = executeSql(sql);  
1033.              conn.commit();  
1034.          } catch (Exception e) {  
1035.              try {  
1036.                  conn.rollback();  
1037.              } catch (SQLException ex) {  
1038.                  ex.printStackTrace();  
1039.              }  
1040.              e.printStackTrace();  
1041.          }  
1042.          return flag;  
1043.      }  
1044.  
1045.      /** 
1046.     * 获得用于数据交换的主键ID,使用的存储过程为生成通用主键ID的PR_MakeMax_TYPK 
1047.     * @param @Bureau_id String 用户登录时选择的机构ID 
1048.     * @param @lab_Id String 用户登录时选择的实验室ID 
1049.     * @param @TableName String 表名 
1050.     * @param @IDNewFormatOut String 输出的ID 
1051.     * @return String 可以返回以下格式的ID:"Bureau_id+lab_id+0000000001" 
1052.     */  
1053.    public String getExchangePKID(String Bureau_id,String lab_Id,String TableName) {  
1054.        String sql ="set nocount on  begin declare @NewID varchar(50)"  
1055.                  +" set @NewID=NULL"  
1056.                  +" exec PR_MakeMax_TYPK N'', N'"+Bureau_id+"', N'"+lab_Id+"',N'"+TableName+"',@NewID out "  
1057.                  +" select @NewID end ";  
1058.        String result ="";  
1059.        try{  
1060.            prepar = conn.prepareStatement(sql);  
1061.            rs = prepar.executeQuery();  
1062.            if (rs.next()) {  
1063.                result = rs.getString(1);  
1064.            }  
1065.        }  
1066.        catch(SQLException e){  
1067.            e.printStackTrace();  
1068.        }  
1069.        return result;  
1070.    }  
1071.  
1072.    public String getExchangePKID(AdminBean ab,String TableName) {  
1073.    String result ="";  
1074.    result=getExchangePKID(ab.getLoginBureaus(),ab.getLoginLab(),TableName);  
1075.    return result;  
1076.}  
1077.  
1078.   
1079.  
1080.   
1081.  
1082.   
1083.  
1084.   
1085.  
1086.   
1087.  
1088.   
1089.  
1090.      //====================私有方法 start=============================================================================  
1091.  
1092.      /* 
1093.           功能描述:根据表的主键id删除记录 
1094.           参数:TableName为要删除记录的表名;FieldName为数据表字段名;FieldValue为数据库表字段值 
1095.           返回值:int。成功返回1,失败返回0 
1096.       */  
1097.      private int Delete(String TableName, String FieldName, String FieldValue) {  
1098.          int flag = 0;  
1099.          String where = " and " + FieldName + " ='" + FieldValue + "'";  
1100.          flag = Delete(TableName, where);  
1101.          return flag;  
1102.      }  
1103.  
1104.  
1105.      //用于批量删除  
1106.      private int Delete(String TableName, String WhereSQL) {  
1107.         int flag = 0;  
1108.         try {  
1109.             String sql = "";  
1110.             sql = " delete from " + TableName + " where 1=1 " + WhereSQL + " ";  
1111.             flag = executeSql(sql);  
1112.  
1113.         } catch (Exception e) {  
1114.             e.printStackTrace();  
1115.         }  
1116.         return flag;  
1117.   }  
1118.  
1119.   //====================私有方法 end=============================================================================  
1120.  
1121.   public String getListToJason(String sql) throws Exception {  
1122.       StringBuffer jasonStr= new StringBuffer();  
1123.       stmt = conn.createStatement();  
1124.       rs = stmt.executeQuery(sql);  
1125.       ResultSetMetaData rsmd = rs.getMetaData();  
1126.       RowSetDynaClass rsdc = new RowSetDynaClass(rs);  
1127.       List list = rsdc.getRows();  
1128.       Iterator ite = list.iterator();  
1129.       int resultCout = list.size();  
1130.       jasonStr.append("{totalCount:"+String.valueOf(resultCout)).append(",data:[");  
1131.       while(ite.hasNext()){  
1132.           DynaBean dyna = (DynaBean)ite.next();  
1133.           jasonStr.append("{");  
1134.           for(int i=1;i<=rsmd.getColumnCount();i++){  
1135.               if (i==rsmd.getColumnCount())  
1136.                   jasonStr.append( rsmd.getColumnName(i)).append(":/"").append(BeanUtils.getSimpleProperty(dyna,rsmd.getColumnName(i).toLowerCase())).append("/"");  
1137.               else  
1138.                   jasonStr.append( rsmd.getColumnName(i)).append(":/"").append(BeanUtils.getSimpleProperty(dyna,rsmd.getColumnName(i).toLowerCase())).append("/",");  
1139.           }  
1140.           jasonStr.append("},");  
1141.       }  
1142.       String te = jasonStr.toString();  
1143.       te = te.substring(0,te.length()-1)+"],success:true}";  
1144.       return te;  
1145.   }  
1146.  
1147.   public String getListToJason(String sql,int start,int limit) throws Exception {  
1148.        StringBuffer jasonStr= new StringBuffer();  
1149.        stmt = conn.createStatement();  
1150.        rs = stmt.executeQuery(sql);  
1151.        ResultSetMetaData rsmd = rs.getMetaData();  
1152.        RowSetDynaClass rsdc = new RowSetDynaClass(rs);  
1153.        List list = rsdc.getRows();  
1154.        int resultCout = list.size();  
1155.        list = list.subList(start,start+limit);  
1156.        Iterator ite = list.iterator();  
1157.        jasonStr.append("{totalCount:"+String.valueOf(resultCout)).append(",data:[");  
1158.        while(ite.hasNext()){  
1159.            DynaBean dyna = (DynaBean)ite.next();  
1160.            jasonStr.append("{");  
1161.            for(int i=1;i<=rsmd.getColumnCount();i++){  
1162.                if (i==rsmd.getColumnCount())  
1163.                    jasonStr.append( rsmd.getColumnName(i)).append(":/"").append(BeanUtils.getSimpleProperty(dyna,rsmd.getColumnName(i).toLowerCase())).append("/"");  
1164.                else  
1165.                    jasonStr.append( rsmd.getColumnName(i)).append(":/"").append(BeanUtils.getSimpleProperty(dyna,rsmd.getColumnName(i).toLowerCase())).append("/",");  
1166.            }  
1167.            jasonStr.append("},");  
1168.        }  
1169.        String te = jasonStr.toString();  
1170.        te = te.substring(0,te.length()-1)+"],success:true}";  
1171.        return te;  
1172.    }  
1173.  
1174.}  
1175.  
1176.-----------------------------------------------------------------------------------------------------------------------------  
1177.  
1178.connect.properties  
1179.  
1180.drivers=net.sourceforge.jtds.jdbc.Driver  
1181.#drivers=com.microsoft.jdbc.sqlserver.SQLServerDriver  
1182.logfile=D://DBConnectPool-logfile.txt  
1183.  
1184.poolName.maxconn=100  
1185.poolName.url=jdbc:jtds:sqlserver://localhost:1433;DatabaseName=my_DB;tds=8.0;lastupdatecount=true  
1186.#poolName.url=jdbc:jtds:sqlserver://localhost:1433;DatabaseName=my_db;tds=8.0;lastupdatecount=true  
1187.poolName.user=sa  
1188.poolName.password=  





分类: JDBC

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值