DBManager

2205 ワード

public class DBManager {

	private final static ThreadLocal<Connection> conns = new ThreadLocal<Connection>();

	public final static Connection getConnection() throws SQLException {
		Connection conn = (Connection) conns.get();
		if (conn == null || conn.isClosed()) {
			conn = ConnectionProvider.getConnection();
			conns.set(conn);
		}
		return new _DebugConnection(conn).getConnection();
	}

	public final static void closeConnection() {
		Connection conn = (Connection) conns.get();
		try {
			if (conn != null && !conn.isClosed()) {
				conn.setAutoCommit(true);
				conn.close();
			}
		} catch (SQLException e) {
		}
		conns.set(null);
	}

	static class _DebugConnection implements InvocationHandler {
		private Connection conn = null;

		public _DebugConnection(Connection conn) {
			this.conn = conn;
		}

		public Connection getConnection() {
			return (Connection) Proxy.newProxyInstance(conn.getClass()
					.getClassLoader(), new Class[] { Connection.class }, this);
		}

		public Object invoke(Object proxy, Method m, Object[] args)
				throws Throwable {
			try {
				String method = m.getName();
				if ("prepareStatement".equals(method)
						|| "createStatement".equals(method)) {
					System.out.println(method);
					System.out.println(args[0]);
				}
				return m.invoke(conn, args);
			} catch (InvocationTargetException e) {
				throw e.getTargetException();
			}
		}
	}

	static class ConnectionProvider {
		public static Connection getConnection() {
			Connection connection = null;
			try {

				Class.forName("oracle.jdbc.OracleDriver").newInstance();
				connection = DriverManager.getConnection(
						"jdbc:oracle:thin:@192.168.0.32:1521:orcl", "omc",
						"omc");
			} catch (Exception e) {
			}
			return connection;
		}
	}
}