public class Logger { private String classname; public Logger(String classname) { this.classname = classname; } public void log(String msg) { System.out.println("[" + this.classname + "] " + msg); } public void error(String msg) { System.out.println("[ERROR] [" + this.classname + "] " + msg); } }Bây giờ ta xây dựng lớp để tạo connections pool đến MySQL trong Java, sự quan trọng và cần thiết cũng như khái niệm về connection pool trong lập trình thì có thể search trên google.com. ở đây ta không đề cập đến. Lớp kết nối sẽ có tên là DBPool:
public class DBPool { private static Logger logger = new Logger("DBPool"); // biến logger của lớp Logger trên private static LinkedList pool = new LinkedList(); // pool để chứa các connections public final static int MAX_CONNECTIONS = 10; // số connection tối đa trong pool là 10, tuỳ ý!! public final static int INI_CONNECTIONS = 2; // số connection khi bắt đầu khởi tạo là 2 }Các phương thức quan trọng trong lớp:
Phương thức tạo một kết nối:
public static Connection makeDBConnection() throws SQLException { Connection conn = null; try { Class.forName(DBConfig.getProperties("_mf_driver", "")); logger.log("URL:" + DBConfig.getProperties("_mf_url", "")); logger.log("User:" + DBConfig.getProperties("_mf_user", "")); conn = DriverManager.getConnection( DBConfig.getProperties("_mf_url", ""), DBConfig.getProperties("_mf_user", ""), DBConfig.getProperties("_mf_passwd", "")); } catch (ClassNotFoundException ex) { throw new SQLException(ex.getMessage()); }catch (Exception e) { // TODO: handle exception } return conn; }Phương thức khởi tạo số connections theo biến INI_CONNECTIONS:
public static void build(int number) { logger.log("Establishing " + number + " connections..."); Connection conn = null; release(); for (int i = 0; i < number; i++) { try { conn = makeDBConnection(); } catch (SQLException ex) { logger.log("Error: " + ex.getMessage()); } if (conn != null) { pool.addLast(conn); } } logger.log("Number of connection: " + size()); }Phương thức lấy về connection, khi các class khác cần connect DB, thì chỉ cần gọi phương thức này là được:
public static Connection getConnection() { Connection conn = null; try{ synchronized (pool) { conn = (java.sql.Connection) pool.removeFirst(); } if (conn == null) { conn = makeDBConnection(); } try { conn.setAutoCommit(true); } catch (Exception ex) {} } catch(Exception e){ logger.error("Method getConnection(): Error executing >>>" + e.toString()); try { logger.log("Make connection again."); conn = makeDBConnection(); conn.setAutoCommit(true); } catch (SQLException e1) { } logger.log(""+conn); } return conn; }
Phương thức đóng một kết nối có trong pool:
public static void putConnection(java.sql.Connection conn) { try { // Ignore closed connection if (conn == null || conn.isClosed()) { logger.log("putConnection: conn is null or closed: " + conn); return; } if (pool.size() >= MAX_CONNECTIONS) { conn.close(); return; } } catch (SQLException ex) {} synchronized (pool) { pool.addLast(conn); pool.notify(); } }Phương thức đóng và xoá tất cả connection trong pool:
public static void release() { logger.log("Closing connections in pool..."); synchronized (pool) { for (Iterator it = pool.iterator(); it.hasNext(); ) { Connection conn = (Connection) it.next(); try { conn.close(); } catch (SQLException e) { logger.error( "release: Cannot close connection! (maybe closed?)"); } } pool.clear(); } logger.log("Release connection OK"); }Ngoài ra còn có các phương thức khác trong lớp DBPool như sau:
// phương thức close một connection và preparedStatement public static void releaseConnection(Connection conn, PreparedStatement preStmt) { putConnection(conn); try { if (preStmt != null) { preStmt.close(); } } catch (SQLException e) {} } public static void releaseConnection(Connection conn, PreparedStatement preStmt, ResultSet rs) { releaseConnection(conn, preStmt); try { if (rs != null) { rs.close(); } } catch (SQLException e) {} } public static void releaseConnection(Connection conn, PreparedStatement preStmt, Statement stmt, ResultSet rs) { releaseConnection(conn, preStmt, rs); try { if (stmt != null) { stmt.close(); } } catch (SQLException e) {} } public static void releaseConnection(Connection conn, CallableStatement cs, ResultSet rs) { putConnection(conn); try { if (cs != null) { cs.close(); } if(rs!=null){ rs.close(); } } catch (SQLException e) {} }Để sử dụng lớp DBPool này ta thử demo với lớp EmployeeDAO dùng để lấy tất cả các nhân viên và để thêm một nhân viên.
public ArrayListCuối cùng cần import các thư viện sau vào:getall() { String sql = "SELECT * FROM employee"; ArrayList lst = new ArrayList (); conn = DBPool.getConnection(); try { psmt = conn.prepareStatement(sql); rs = psmt.executeQuery(); while (rs.next()) { Employee employee = new Employee(); employee.setId(rs.getInt("EmployeeId")); employee.setName(rs.getString("EmployeeName")); lst.add(employee); } } catch (SQLException e) { logger.error("Error: Not get all employee " + e.getMessage()); e.printStackTrace(); } finally { DBPool.releaseConnection(conn, psmt, rs); } return lst; } public void insert(Employee employee) { String sql = "INSERT INTO employee(name) VALUES(?)"; conn = DBPool.getConnection(); try { psmt = conn.prepareStatement(sql); psmt.setString(1, employee.getName()); psmt.executeUpdate(); } catch (SQLException e) { logger.error("Error: Not insert employee! " + e.getMessage()); e.printStackTrace(); } finally { DBPool.releaseConnection(conn, psmt); } }
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Iterator; import java.util.LinkedList;Để connect tới được CSDL MySQL ta dùng gói mysql-connector-java_5.1.14.jar. còn nếu dùng maven thì có thể thêm doạn dependency sau:
Thanks & Rgds!mysql mysql-connector-java 5.1.14
Không có nhận xét nào:
Đăng nhận xét