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();
+ }
+ }
+ }
+}