diff --git a/src/bootswithdefer/JDCBPool/ConnectionService.java b/src/bootswithdefer/JDCBPool/ConnectionService.java deleted file mode 100644 index 3ec6732..0000000 --- a/src/bootswithdefer/JDCBPool/ConnectionService.java +++ /dev/null @@ -1,104 +0,0 @@ -package bootswithdefer.JDCBPool; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.util.Enumeration; -import java.util.Vector; - -/** - * Purpose:Realizes a connection pool for all JDBC connections.
- * Description:http://java.sun.com/developer/onlineTraining/Programming/JDCBook/ - * conpool.html
- * Copyright:Licensed under the Apache License, Version 2.0. - * http://www.apache.org/licenses/LICENSE-2.0
- * Company:SIMPL
- * - * @author schneimi - * @version $Id$
- * @link http://code.google.com/p/simpl09/ - */ -public class ConnectionService { - private Vector connections; - private String url, user, password; - final private long timeout = 60000; - private ConnectionReaper reaper; - final private int poolsize = 10; - - public ConnectionService(String url, String user, String password) { - this.url = url; - this.user = user; - this.password = password; - connections = new Vector(poolsize); - reaper = new ConnectionReaper(this); - reaper.start(); - } - - public synchronized void reapConnections() { - long stale = System.currentTimeMillis() - timeout; - Enumeration connlist = connections.elements(); - - while ((connlist != null) && (connlist.hasMoreElements())) { - JDCConnection conn = connlist.nextElement(); - - if ((conn.inUse()) && (stale > conn.getLastUse()) && (!conn.validate())) { - removeConnection(conn); - } - } - } - - public synchronized void closeConnections() { - Enumeration connlist = connections.elements(); - - while ((connlist != null) && (connlist.hasMoreElements())) { - JDCConnection conn = connlist.nextElement(); - removeConnection(conn); - } - } - - private synchronized void removeConnection(JDCConnection conn) { - connections.removeElement(conn); - } - - public synchronized Connection getConnection() throws SQLException { - JDCConnection c; - - for (int i = 0; i < connections.size(); i++) { - c = connections.elementAt(i); - if (c.lease()) { - return c; - } - } - - Connection conn = DriverManager.getConnection(url, user, password); - c = new JDCConnection(conn, this); - c.lease(); - connections.addElement(c); - - return c.getConnection(); - } - - public synchronized void returnConnection(JDCConnection conn) { - conn.expireLease(); - } -} - -class ConnectionReaper extends Thread { - private ConnectionService pool; - private final long delay = 300000; - - ConnectionReaper(ConnectionService pool) { - this.pool = pool; - } - - @Override - public void run() { - while (true) { - try { - Thread.sleep(delay); - } catch (InterruptedException e) { - } - pool.reapConnections(); - } - } -} diff --git a/src/bootswithdefer/JDCBPool/JDCConnection.java b/src/bootswithdefer/JDCBPool/JDCConnection.java deleted file mode 100644 index e005e90..0000000 --- a/src/bootswithdefer/JDCBPool/JDCConnection.java +++ /dev/null @@ -1,455 +0,0 @@ -package bootswithdefer.JDCBPool; - -import java.sql.Array; -import java.sql.Blob; -import java.sql.CallableStatement; -import java.sql.Clob; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.NClob; -import java.sql.PreparedStatement; -import java.sql.SQLClientInfoException; -import java.sql.SQLException; -import java.sql.SQLWarning; -import java.sql.SQLXML; -import java.sql.Savepoint; -import java.sql.Statement; -import java.sql.Struct; -import java.util.Map; -import java.util.Properties; - -/** - * Purpose:Wrapper for JDBCConnection.
- * Description:http://java.sun.com/developer/onlineTraining/Programming/JDCBook/ - * conpool.html
- * Copyright:Licensed under the Apache License, Version 2.0. - * http://www.apache.org/licenses/LICENSE-2.0
- * Company:SIMPL
- * - * @author schneimi - * @version $Id$
- * @link http://code.google.com/p/simpl09/ - */ -public class JDCConnection implements Connection { - private ConnectionService pool; - private Connection conn; - private boolean inuse; - private long timestamp; - - public JDCConnection(Connection conn, ConnectionService pool) { - this.conn = conn; - this.pool = pool; - this.inuse = false; - this.timestamp = 0; - } - - public synchronized boolean lease() { - if (inuse) { - return false; - } else { - inuse = true; - timestamp = System.currentTimeMillis(); - return true; - } - } - - public boolean validate() { - try { - conn.getMetaData(); - } catch (Exception e) { - return false; - } - return true; - } - - public boolean inUse() { - return inuse; - } - - public long getLastUse() { - return timestamp; - } - - public void close() throws SQLException { - pool.returnConnection(this); - } - - protected void expireLease() { - inuse = false; - } - - protected Connection getConnection() { - return conn; - } - - public PreparedStatement prepareStatement(String sql) throws SQLException { - return conn.prepareStatement(sql); - } - - public CallableStatement prepareCall(String sql) throws SQLException { - return conn.prepareCall(sql); - } - - public Statement createStatement() throws SQLException { - return conn.createStatement(); - } - - public String nativeSQL(String sql) throws SQLException { - return conn.nativeSQL(sql); - } - - public void setAutoCommit(boolean autoCommit) throws SQLException { - conn.setAutoCommit(autoCommit); - } - - public boolean getAutoCommit() throws SQLException { - return conn.getAutoCommit(); - } - - public void commit() throws SQLException { - conn.commit(); - } - - public void rollback() throws SQLException { - conn.rollback(); - } - - public boolean isClosed() throws SQLException { - return conn.isClosed(); - } - - public DatabaseMetaData getMetaData() throws SQLException { - return conn.getMetaData(); - } - - public void setReadOnly(boolean readOnly) throws SQLException { - conn.setReadOnly(readOnly); - } - - public boolean isReadOnly() throws SQLException { - return conn.isReadOnly(); - } - - public void setCatalog(String catalog) throws SQLException { - conn.setCatalog(catalog); - } - - public String getCatalog() throws SQLException { - return conn.getCatalog(); - } - - public void setTransactionIsolation(int level) throws SQLException { - conn.setTransactionIsolation(level); - } - - public int getTransactionIsolation() throws SQLException { - return conn.getTransactionIsolation(); - } - - public SQLWarning getWarnings() throws SQLException { - return conn.getWarnings(); - } - - public void clearWarnings() throws SQLException { - conn.clearWarnings(); - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#createArrayOf(java.lang.String, java.lang.Object[]) - */ - @Override - public Array createArrayOf(String typeName, Object[] elements) throws SQLException { - return conn.createArrayOf(typeName, elements); - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#createBlob() - */ - @Override - public Blob createBlob() throws SQLException { - return createBlob(); - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#createClob() - */ - @Override - public Clob createClob() throws SQLException { - return conn.createClob(); - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#createNClob() - */ - @Override - public NClob createNClob() throws SQLException { - return conn.createNClob(); - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#createSQLXML() - */ - @Override - public SQLXML createSQLXML() throws SQLException { - return conn.createSQLXML(); - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#createStatement(int, int) - */ - @Override - public Statement createStatement(int resultSetType, int resultSetConcurrency) - throws SQLException { - return conn.createStatement(resultSetType, resultSetConcurrency); - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#createStatement(int, int, int) - */ - @Override - public Statement createStatement(int resultSetType, int resultSetConcurrency, - int resultSetHoldability) throws SQLException { - return conn - .createStatement(resultSetType, resultSetConcurrency, resultSetHoldability); - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#createStruct(java.lang.String, java.lang.Object[]) - */ - @Override - public Struct createStruct(String typeName, Object[] attributes) throws SQLException { - return conn.createStruct(typeName, attributes); - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#getClientInfo() - */ - @Override - public Properties getClientInfo() throws SQLException { - return conn.getClientInfo(); - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#getClientInfo(java.lang.String) - */ - @Override - public String getClientInfo(String name) throws SQLException { - return conn.getClientInfo(name); - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#getHoldability() - */ - @Override - public int getHoldability() throws SQLException { - return conn.getHoldability(); - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#getTypeMap() - */ - @Override - public Map> getTypeMap() throws SQLException { - // TODO Auto-generated method stub - return null; - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#isValid(int) - */ - @Override - public boolean isValid(int timeout) throws SQLException { - // TODO Auto-generated method stub - return false; - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#prepareCall(java.lang.String, int, int) - */ - @Override - public CallableStatement prepareCall(String sql, int resultSetType, - int resultSetConcurrency) throws SQLException { - // TODO Auto-generated method stub - return null; - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#prepareCall(java.lang.String, int, int, int) - */ - @Override - public CallableStatement prepareCall(String sql, int resultSetType, - int resultSetConcurrency, int resultSetHoldability) throws SQLException { - // TODO Auto-generated method stub - return null; - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#prepareStatement(java.lang.String, int) - */ - @Override - public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) - throws SQLException { - // TODO Auto-generated method stub - return null; - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#prepareStatement(java.lang.String, int[]) - */ - @Override - public PreparedStatement prepareStatement(String sql, int[] columnIndexes) - throws SQLException { - // TODO Auto-generated method stub - return null; - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#prepareStatement(java.lang.String, java.lang.String[]) - */ - @Override - public PreparedStatement prepareStatement(String sql, String[] columnNames) - throws SQLException { - // TODO Auto-generated method stub - return null; - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#prepareStatement(java.lang.String, int, int) - */ - @Override - public PreparedStatement prepareStatement(String sql, int resultSetType, - int resultSetConcurrency) throws SQLException { - // TODO Auto-generated method stub - return null; - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#prepareStatement(java.lang.String, int, int, int) - */ - @Override - public PreparedStatement prepareStatement(String sql, int resultSetType, - int resultSetConcurrency, int resultSetHoldability) throws SQLException { - // TODO Auto-generated method stub - return null; - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#releaseSavepoint(java.sql.Savepoint) - */ - @Override - public void releaseSavepoint(Savepoint savepoint) throws SQLException { - // TODO Auto-generated method stub - - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#rollback(java.sql.Savepoint) - */ - @Override - public void rollback(Savepoint savepoint) throws SQLException { - // TODO Auto-generated method stub - - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#setClientInfo(java.util.Properties) - */ - @Override - public void setClientInfo(Properties properties) throws SQLClientInfoException { - // TODO Auto-generated method stub - - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#setClientInfo(java.lang.String, java.lang.String) - */ - @Override - public void setClientInfo(String name, String value) throws SQLClientInfoException { - // TODO Auto-generated method stub - - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#setHoldability(int) - */ - @Override - public void setHoldability(int holdability) throws SQLException { - // TODO Auto-generated method stub - - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#setSavepoint() - */ - @Override - public Savepoint setSavepoint() throws SQLException { - // TODO Auto-generated method stub - return null; - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#setSavepoint(java.lang.String) - */ - @Override - public Savepoint setSavepoint(String name) throws SQLException { - // TODO Auto-generated method stub - return null; - } - - /* - * (non-Javadoc) - * @see java.sql.Connection#setTypeMap(java.util.Map) - */ - @Override - public void setTypeMap(Map> map) throws SQLException { - // TODO Auto-generated method stub - - } - - /* - * (non-Javadoc) - * @see java.sql.Wrapper#isWrapperFor(java.lang.Class) - */ - @Override - public boolean isWrapperFor(Class iface) throws SQLException { - // TODO Auto-generated method stub - return false; - } - - /* - * (non-Javadoc) - * @see java.sql.Wrapper#unwrap(java.lang.Class) - */ - @Override - public T unwrap(Class iface) throws SQLException { - // TODO Auto-generated method stub - return null; - } -} diff --git a/src/bootswithdefer/JDCBPool/JDCConnectionDriver.java b/src/bootswithdefer/JDCBPool/JDCConnectionDriver.java deleted file mode 100644 index 051f1dc..0000000 --- a/src/bootswithdefer/JDCBPool/JDCConnectionDriver.java +++ /dev/null @@ -1,63 +0,0 @@ -package bootswithdefer.JDCBPool; - -import java.sql.Connection; -import java.sql.Driver; -import java.sql.DriverManager; -import java.sql.DriverPropertyInfo; -import java.sql.SQLException; -import java.util.Properties; - -/** - * Purpose:Wrapper for JDBCConnectionDriver.
- * Description:http://java.sun.com/developer/onlineTraining/Programming/JDCBook/ - * conpool.html
- * Copyright:Licensed under the Apache License, Version 2.0. - * http://www.apache.org/licenses/LICENSE-2.0
- * Company: SIMPL
- * - * @author schneimi - * @version $Id: JDCConnectionDriver.java 1224 2010-04-28 14:17:34Z - * michael.schneidt@arcor.de $
- * @link http://code.google.com/p/simpl09/ - */ -public class JDCConnectionDriver implements Driver { - public static final String URL_PREFIX = "jdbc:jdc:"; - private static final int MAJOR_VERSION = 1; - private static final int MINOR_VERSION = 0; - private ConnectionService pool; - - public JDCConnectionDriver(String driver, String url, String user, String password) - throws ClassNotFoundException, InstantiationException, IllegalAccessException, - SQLException { - DriverManager.registerDriver(this); - Class.forName(driver).newInstance(); - pool = new ConnectionService(url, user, password); - } - - public Connection connect(String url, Properties props) throws SQLException { - if (!url.startsWith(JDCConnectionDriver.URL_PREFIX)) { - return null; - } - return pool.getConnection(); - } - - public boolean acceptsURL(String url) { - return url.startsWith(JDCConnectionDriver.URL_PREFIX); - } - - public int getMajorVersion() { - return JDCConnectionDriver.MAJOR_VERSION; - } - - public int getMinorVersion() { - return JDCConnectionDriver.MINOR_VERSION; - } - - public DriverPropertyInfo[] getPropertyInfo(String str, Properties props) { - return new DriverPropertyInfo[0]; - } - - public boolean jdbcCompliant() { - return false; - } -} diff --git a/src/de/diddiz/LogBlock/BlockStats.java b/src/de/diddiz/LogBlock/BlockStats.java index 9167048..74e0a7c 100644 --- a/src/de/diddiz/LogBlock/BlockStats.java +++ b/src/de/diddiz/LogBlock/BlockStats.java @@ -17,13 +17,11 @@ public class BlockStats implements Runnable private Player player; private Block block; private Connection conn; - private String table; - BlockStats(Connection conn, Player player, Block block, String table) { + BlockStats(Connection conn, Player player, Block block) { this.player = player; this.conn = conn; this.block = block; - this.table = table; } @Override @@ -32,6 +30,7 @@ public class BlockStats implements Runnable player.sendMessage(ChatColor.RED + "Failed to create database connection"); return; } + String table = LogBlock.config.tables.get(block.getWorld().getName().hashCode()); if (table == null) { player.sendMessage(ChatColor.RED + "This world isn't logged"); return; diff --git a/src/de/diddiz/LogBlock/ClearLog.java b/src/de/diddiz/LogBlock/ClearLog.java index cdd215b..7ea132a 100644 --- a/src/de/diddiz/LogBlock/ClearLog.java +++ b/src/de/diddiz/LogBlock/ClearLog.java @@ -13,9 +13,11 @@ public class ClearLog implements Runnable private Connection conn; private File dumbFolder; - public ClearLog(Connection conn, File dataFolder) { - this.conn = conn; - dumbFolder = new File(dataFolder, "dumb"); + public ClearLog(LogBlock logblock) { + conn = logblock.pool.getConnection(); + if (conn == null) + return; + dumbFolder = new File(logblock.getDataFolder(), "dumb"); dumbFolder.mkdirs(); } diff --git a/src/de/diddiz/LogBlock/Consumer.java b/src/de/diddiz/LogBlock/Consumer.java index 27fcd2b..8758b00 100644 --- a/src/de/diddiz/LogBlock/Consumer.java +++ b/src/de/diddiz/LogBlock/Consumer.java @@ -1,7 +1,6 @@ package de.diddiz.LogBlock; import java.sql.Connection; -import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @@ -17,6 +16,11 @@ public class Consumer implements Runnable private LinkedBlockingQueue bqueue = new LinkedBlockingQueue(); private HashSet hiddenplayers = new HashSet(); private Connection conn = null; + private LogBlock logblock; + + Consumer (LogBlock logblock) { + this.logblock = logblock; + } public void queueBlock(Player player, Block block, int typeAfter) { queueBlock(player.getName(), block, 0, typeAfter, (byte)0, null, null); @@ -67,7 +71,7 @@ public class Consumer implements Runnable public void run() { try { if (conn == null || conn.isClosed()) - conn = DriverManager.getConnection("jdbc:jdc:jdcpool"); + conn = logblock.pool.getConnection(); } catch (SQLException ex) { LogBlock.log.severe("[LogBlock Consumer] Can't get a connection"); } diff --git a/src/de/diddiz/LogBlock/LogBlock.java b/src/de/diddiz/LogBlock/LogBlock.java index 4315b00..fa846ee 100644 --- a/src/de/diddiz/LogBlock/LogBlock.java +++ b/src/de/diddiz/LogBlock/LogBlock.java @@ -5,7 +5,6 @@ import java.io.FileNotFoundException; import java.net.URL; import java.sql.Connection; import java.sql.DatabaseMetaData; -import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.logging.Level; @@ -41,19 +40,19 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; -import bootswithdefer.JDCBPool.JDCConnectionDriver; - import com.nijikokun.bukkit.Permissions.Permissions; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.bukkit.selections.CuboidSelection; import com.sk89q.worldedit.bukkit.selections.Selection; +import de.diddiz.util.ConnectionPool; import de.diddiz.util.Download; public class LogBlock extends JavaPlugin { static Logger log; static Config config; + ConnectionPool pool; private Consumer consumer = null; @Override @@ -88,11 +87,11 @@ public class LogBlock extends JavaPlugin return; } try { - new JDCConnectionDriver(config.dbDriver, config.dbUrl, config.dbUsername, config.dbPassword); - Connection conn = getConnection(); + pool = new ConnectionPool(config.dbDriver, config.dbUrl, config.dbUsername, config.dbPassword); + Connection conn = pool.getConnection(); conn.close(); } catch (Exception ex) { - log.log(Level.SEVERE, "[LogBlock] Exception while cheching database connection", ex); + log.log(Level.SEVERE, "[LogBlock] Exception while checking database connection", ex); getServer().getPluginManager().disablePlugin(this); return; } @@ -102,7 +101,7 @@ public class LogBlock extends JavaPlugin return; } if (config.keepLogDays >= 0) - new Thread(new ClearLog(getConnection(), getDataFolder())).start(); + new Thread(new ClearLog(this)).start(); LBBlockListener lbBlockListener = new LBBlockListener(); LBPlayerListener lbPlayerListener = new LBPlayerListener(); PluginManager pm = getServer().getPluginManager(); @@ -121,7 +120,7 @@ public class LogBlock extends JavaPlugin pm.registerEvent(Type.ENTITY_EXPLODE, new LBEntityListener(), Event.Priority.Monitor, this); if (config.logLeavesDecay) pm.registerEvent(Type.LEAVES_DECAY, lbBlockListener, Event.Priority.Monitor, this); - consumer = new Consumer(); + consumer = new Consumer(this); getServer().getScheduler().scheduleAsyncRepeatingTask(this, consumer, config.delay * 20, config.delay * 20); log.info("Logblock v" + getDescription().getVersion() + " enabled."); } @@ -148,7 +147,7 @@ public class LogBlock extends JavaPlugin return true; } Player player = (Player)sender; - Connection conn = getConnection(); + Connection conn = pool.getConnection(); String table = config.tables.get(player.getWorld().getName().hashCode()); if (conn == null) { player.sendMessage(ChatColor.RED + "Can't create SQL connection."); @@ -391,18 +390,8 @@ public class LogBlock extends JavaPlugin return true; } - private Connection getConnection() - { - try { - return DriverManager.getConnection("jdbc:jdc:jdcpool"); - } catch (SQLException ex) { - log.log(Level.SEVERE, "[LogBlock] Can't get a connection", ex); - return null; - } - } - private boolean checkTables() { - Connection conn = getConnection(); + Connection conn = pool.getConnection(); Statement state = null; if (conn == null) return false; @@ -567,13 +556,13 @@ public class LogBlock extends JavaPlugin } public void onPlayerJoin(PlayerJoinEvent event) { - Connection conn = getConnection(); + Connection conn = pool.getConnection(); Statement state = null; if (conn == null) return; try { state = conn.createStatement(); - state.execute("INSERT IGNORE INTO `lb-players` (`playername`) VALUES ('" + event.getPlayer().getName() + "');"); + state.execute("INSERT IGNORE INTO `lb-players` (playername) VALUES ('" + event.getPlayer().getName() + "');"); } catch (SQLException ex) { LogBlock.log.log(Level.SEVERE, "[LogBlock] SQL exception", ex); } finally { @@ -594,10 +583,10 @@ public class LogBlock extends JavaPlugin public void onPlayerInteract(PlayerInteractEvent event) { if (!event.isCancelled()) { if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getMaterial().getId() == LogBlock.config.toolID && CheckPermission(event.getPlayer(), "logblock.lookup")) { - getServer().getScheduler().scheduleAsyncDelayedTask(LogBlock.this, new BlockStats(getConnection(), event.getPlayer(), event.getClickedBlock(), config.tables.get(event.getPlayer().getWorld().getName().hashCode()))); + getServer().getScheduler().scheduleAsyncDelayedTask(LogBlock.this, new BlockStats(pool.getConnection(), event.getPlayer(), event.getClickedBlock())); event.setCancelled(true); } else if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getMaterial().getId() == LogBlock.config.toolblockID && CheckPermission(event.getPlayer(), "logblock.lookup")) { - getServer().getScheduler().scheduleAsyncDelayedTask(LogBlock.this, new BlockStats(getConnection(), event.getPlayer(), event.getClickedBlock().getFace(event.getBlockFace()), config.tables.get(event.getPlayer().getWorld().getName().hashCode()))); + getServer().getScheduler().scheduleAsyncDelayedTask(LogBlock.this, new BlockStats(pool.getConnection(), event.getPlayer(), event.getClickedBlock().getFace(event.getBlockFace()))); if (config.toolblockRemove) event.setCancelled(true); } diff --git a/src/de/diddiz/util/ConnectionPool.java b/src/de/diddiz/util/ConnectionPool.java new file mode 100644 index 0000000..c0cec4b --- /dev/null +++ b/src/de/diddiz/util/ConnectionPool.java @@ -0,0 +1,434 @@ +/** + * Purpose:Wrapper for JDBCConnectionDriver.
+ * Description:http://java.sun.com/developer/onlineTraining/Programming/JDCBook/ + * conpool.html
+ * Copyright:Licensed under the Apache License, Version 2.0. + * http://www.apache.org/licenses/LICENSE-2.0
+ * Company: SIMPL
+ * + * @author schneimi + * @version $Id: JDCConnectionDriver.java 1224 2010-04-28 14:17:34Z + * michael.schneidt@arcor.de $
+ * @link http://code.google.com/p/simpl09/ + */ + +package de.diddiz.util; + +import java.sql.Array; +import java.sql.Blob; +import java.sql.CallableStatement; +import java.sql.Clob; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.Driver; +import java.sql.DriverManager; +import java.sql.DriverPropertyInfo; +import java.sql.NClob; +import java.sql.PreparedStatement; +import java.sql.SQLClientInfoException; +import java.sql.SQLException; +import java.sql.SQLWarning; +import java.sql.SQLXML; +import java.sql.Savepoint; +import java.sql.Statement; +import java.sql.Struct; +import java.util.Enumeration; +import java.util.Map; +import java.util.Properties; +import java.util.Vector; + +public class ConnectionPool implements Driver { + public static final String URL_PREFIX = "jdbc:jdc:"; + private static final int MAJOR_VERSION = 1; + private static final int MINOR_VERSION = 0; + private ConnectionService pool; + + public ConnectionPool(String driver, String url, String user, String password) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException { + DriverManager.registerDriver(this); + Class.forName(driver).newInstance(); + pool = new ConnectionService(url, user, password); + } + + public Connection connect(String url, Properties props) throws SQLException { + if (!url.startsWith(URL_PREFIX)) + return null; + return pool.getConnection(); + } + + public Connection getConnection() { + try { + return pool.getConnection(); + } catch (SQLException e) { + return null; + } + } + + public boolean acceptsURL(String url) { + return url.startsWith(URL_PREFIX); + } + + public int getMajorVersion() { + return MAJOR_VERSION; + } + + public int getMinorVersion() { + return MINOR_VERSION; + } + + public DriverPropertyInfo[] getPropertyInfo(String str, Properties props) { + return new DriverPropertyInfo[0]; + } + + public boolean jdbcCompliant() { + return false; + } + + private class JDCConnection implements Connection { + private ConnectionService pool; + private Connection conn; + private boolean inuse; + private long timestamp; + + public JDCConnection(Connection conn, ConnectionService pool) { + this.conn = conn; + this.pool = pool; + this.inuse = false; + this.timestamp = 0; + } + + public synchronized boolean lease() { + if (inuse) { + return false; + } else { + inuse = true; + timestamp = System.currentTimeMillis(); + return true; + } + } + + public boolean validate() { + try { + conn.getMetaData(); + } catch (Exception e) { + return false; + } + return true; + } + + public boolean inUse() { + return inuse; + } + + public long getLastUse() { + return timestamp; + } + + public void close() throws SQLException { + pool.returnConnection(this); + } + + protected void expireLease() { + inuse = false; + } + + protected Connection getConnection() { + return conn; + } + + public PreparedStatement prepareStatement(String sql) throws SQLException { + return conn.prepareStatement(sql); + } + + public CallableStatement prepareCall(String sql) throws SQLException { + return conn.prepareCall(sql); + } + + public Statement createStatement() throws SQLException { + return conn.createStatement(); + } + + public String nativeSQL(String sql) throws SQLException { + return conn.nativeSQL(sql); + } + + public void setAutoCommit(boolean autoCommit) throws SQLException { + conn.setAutoCommit(autoCommit); + } + + public boolean getAutoCommit() throws SQLException { + return conn.getAutoCommit(); + } + + public void commit() throws SQLException { + conn.commit(); + } + + public void rollback() throws SQLException { + conn.rollback(); + } + + public boolean isClosed() throws SQLException { + return conn.isClosed(); + } + + public DatabaseMetaData getMetaData() throws SQLException { + return conn.getMetaData(); + } + + public void setReadOnly(boolean readOnly) throws SQLException { + conn.setReadOnly(readOnly); + } + + public boolean isReadOnly() throws SQLException { + return conn.isReadOnly(); + } + + public void setCatalog(String catalog) throws SQLException { + conn.setCatalog(catalog); + } + + public String getCatalog() throws SQLException { + return conn.getCatalog(); + } + + public void setTransactionIsolation(int level) throws SQLException { + conn.setTransactionIsolation(level); + } + + public int getTransactionIsolation() throws SQLException { + return conn.getTransactionIsolation(); + } + + public SQLWarning getWarnings() throws SQLException { + return conn.getWarnings(); + } + + public void clearWarnings() throws SQLException { + conn.clearWarnings(); + } + + @Override + public Array createArrayOf(String typeName, Object[] elements) throws SQLException { + return conn.createArrayOf(typeName, elements); + } + + @Override + public Blob createBlob() throws SQLException { + return createBlob(); + } + + @Override + public Clob createClob() throws SQLException { + return conn.createClob(); + } + + @Override + public NClob createNClob() throws SQLException { + return conn.createNClob(); + } + + @Override + public SQLXML createSQLXML() throws SQLException { + return conn.createSQLXML(); + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency) + throws SQLException { + return conn.createStatement(resultSetType, resultSetConcurrency); + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency, + int resultSetHoldability) throws SQLException { + return conn + .createStatement(resultSetType, resultSetConcurrency, resultSetHoldability); + } + + @Override + public Struct createStruct(String typeName, Object[] attributes) throws SQLException { + return conn.createStruct(typeName, attributes); + } + + @Override + public Properties getClientInfo() throws SQLException { + return conn.getClientInfo(); + } + + @Override + public String getClientInfo(String name) throws SQLException { + return conn.getClientInfo(name); + } + + @Override + public int getHoldability() throws SQLException { + return conn.getHoldability(); + } + + @Override + public Map> getTypeMap() throws SQLException { + return null; + } + + @Override + public boolean isValid(int timeout) throws SQLException { + return false; + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + return null; + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + return null; + } + + @Override + public void releaseSavepoint(Savepoint savepoint) throws SQLException { + } + + @Override + public void rollback(Savepoint savepoint) throws SQLException { + } + + @Override + public void setClientInfo(Properties properties) throws SQLClientInfoException { + } + + @Override + public void setClientInfo(String name, String value) throws SQLClientInfoException { + } + + @Override + public void setHoldability(int holdability) throws SQLException { + } + + @Override + public Savepoint setSavepoint() throws SQLException { + return null; + } + + @Override + public Savepoint setSavepoint(String name) throws SQLException { + return null; + } + + @Override + public void setTypeMap(Map> map) throws SQLException { + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return false; + } + + @Override + public T unwrap(Class iface) throws SQLException { + return null; + } + } + + public class ConnectionService { + private Vector connections; + private String url, user, password; + final private long timeout = 60000; + private ConnectionReaper reaper; + final private int poolsize = 10; + + public ConnectionService(String url, String user, String password) { + this.url = url; + this.user = user; + this.password = password; + connections = new Vector(poolsize); + reaper = new ConnectionReaper(this); + reaper.start(); + } + + public synchronized void reapConnections() { + long stale = System.currentTimeMillis() - timeout; + Enumeration connlist = connections.elements(); + while ((connlist != null) && (connlist.hasMoreElements())) { + JDCConnection conn = connlist.nextElement(); + if ((conn.inUse()) && (stale > conn.getLastUse()) && (!conn.validate())) + removeConnection(conn); + } + } + + public synchronized void closeConnections() { + Enumeration connlist = connections.elements(); + while ((connlist != null) && (connlist.hasMoreElements())) { + JDCConnection conn = connlist.nextElement(); + removeConnection(conn); + } + } + + private synchronized void removeConnection(JDCConnection conn) { + connections.removeElement(conn); + } + + public synchronized Connection getConnection() throws SQLException { + JDCConnection c; + for (int i = 0; i < connections.size(); i++) { + c = connections.elementAt(i); + if (c.lease()) + return c; + } + Connection conn = DriverManager.getConnection(url, user, password); + c = new JDCConnection(conn, this); + c.lease(); + connections.addElement(c); + return c.getConnection(); + } + + public synchronized void returnConnection(JDCConnection conn) { + conn.expireLease(); + } + } + + class ConnectionReaper extends Thread { + private ConnectionService pool; + private final long delay = 300000; + + ConnectionReaper(ConnectionService pool) { + this.pool = pool; + } + + @Override + public void run() { + while (true) { + try { + Thread.sleep(delay); + } catch (InterruptedException e) { + } + pool.reapConnections(); + } + } + } +}