Während der Entwicklung ist es häufig erforderlich, einige Vorgänge an der Datenbank durchzuführen, z. B. allgemeine Hinzufügungen, Löschungen, Änderungen und Abfragen Daten sind klein, Es kann direkt betrieben werden, aber wenn die Datenmenge zunimmt, dauert jede Verbindung und Freigabe der Datenbank eine gewisse Zeit. Zu diesem Zeitpunkt kann der Datenbankverbindungspool zum Aufrechterhalten der Datenbankverbindung verwendet werden Reduzieren Sie den Overhead, der durch die Verbindung mit der Datenbank im Programm verursacht wird, und reduzieren Sie den Druck auf die Datenbank. Was ist also der Datenbankverbindungspool? Wie der Name schon sagt, handelt es sich um einen Teich, bei dem es sich um einen Link zur Fischzucht handelt Sie müssen keinen Fisch mehr kaufen und selbst züchten. Der Verbindungspool wird zum Speichern aller Links zur Datenbank verwendet. Nach der Verwendung können Sie diese direkt abrufen Zurück in den Pool, dann müssen wir den Code nicht selbst schreiben. Es gibt drei gängige Open-Source-Verbindungspools, die ich habe Ich habe C3P0 und Proxool noch nie verwendet, nur ganz einfach. Ich habe den Dbcp-Pool verwendet. Hier werde ich über die Verwendung des Dbcp-Datenbankverbindungspools und einige Fallstricke sprechen, die bei der Verwendung auftreten
Abbildung 1, vor der Verwendung des Verbindungspools
Abbildung 2 Nach der Verwendung des Verbindungspools
Wie in Abbildung gezeigt 1 oben: Bevor Sie den Verbindungspool verwenden, müssen Sie jedes Mal eine Verbindung zur Datenbank herstellen und jederzeit freigeben. Wenn die Datenmenge groß ist, ist ein hoher Overhead erforderlich, um eine Verbindung zur Datenbank herzustellen. und häufiges Zugreifen und Freigeben der Datenbank wird auch einen großen Druck auf die Datenbank ausüben. Abbildung 2 zeigt, dass nach der Verwendung des Datenbankverbindungspools alle Links im Pool platziert werden, ohne sie freizugeben Der Pool behält lange Verbindungen zur Datenbank bei. Wenn die Verbindung nicht ausreicht, müssen nachfolgende Benutzer warten 2. Verwenden Sie das von tomcat-dbcp verwendete JAR-Paket
3. Verwendete Konfigurationen
Diese Konfigurationen müssen nur indbname.Driver=com.mysql.jdbc.Driver dbname.Url=jdbc:mysql://<your ip>/<your dbname>?useUnicode=true&characterEncoding=UTF-8 &autoReconnect=true&failOverReadOnly=false&maxReconnects=10&autoReconnectForPools=true&zeroDateTimeBehavior=convertToNull&connectTimeout=3000 dbname.Username=<your username> dbname.Password=<your password> dbname.InitialSize=15 dbname.MinIdle=10 dbname.MaxIdle=20 dbname.MaxWait=5000 dbname.MaxActive=20 dbname.validationQuery=select 1
wobei Treiber, URL, Benutzername und Passwort gängige Datenbankverbindungskonfigurationen sind
InitialSize为初始化建立的连接数
minidle为数据库连接池中保持的最少的空闲的链接数
maxidle数据库连接池中保持的最大的连接数
maxwait等待数据库连接池分配连接的最长时间,超出之后报错
maxactivite最大的活动链接数,如果是多线程可以设置为超出多线程个数个链接数
<pre name="code" class="java">validationQuery测试是否连接是有效的sql语句
public abstract class DB { private static HashMap<String, DataSource> dsTable = new HashMap<String, DataSource>();//此处记得用static private BasicDataSource ds; private PreparedStatement stmt = null; private DataSource getDataSource(String n) { if (dsTable.containsKey(n)) { return dsTable.get(n);//如果不同的数据库,多个连接池 } else { synchronized (dsTable) { ds = new BasicDataSource(); ds.setDriverClassName(DBConfig.getString("db", n.concat(".Driver")));//将<yourname>.properties的值读进来 ds.setUrl(DBConfig.getString("db", n.concat(".Url"))); ds.setUsername(DBConfig.getString("db", n.concat(".Username"))); ds.setPassword(DBConfig.getString("db", n.concat(".Password"))); ds.setInitialSize(DBConfig.getInteger("db", n.concat(".InitialSize"))); ds.setMinIdle(DBConfig.getInteger("db", n.concat(".MinIdle"))); ds.setMaxIdle(DBConfig.getInteger("db", n.concat(".MaxIdle"))); ds.setMaxWait(DBConfig.getInteger("db", n.concat(".MaxWait"))); ds.setMaxActive(DBConfig.getInteger("db", n.concat(".MaxActive"))); ds.setValidationQuery(DBConfig.getString("db", n.concat(".validationQuery"))); dsTable.put(n, ds); return ds; } } } protected Connection conn; public boolean open() throws SQLException { BasicDataSource bds=(BasicDataSource)this.getDataSource(this.getConnectionName()); System.out.println("connection_number:"+bds.getNumActive()+"dsTable:"+dsTable); this.conn = this.getDataSource(this.getConnectionName()).getConnection(); return true; } public void close() throws SQLException { if (this.conn != null) this.conn.close(); } protected abstract String getConnectionName();//此函数可以根据自己的需求,将数据库的名字传进来即可 public void prepareStatement(String sql) throws SQLException { this.stmt = this.conn.prepareStatement(sql); } public void setObject(int index, Object value, int type) throws SQLException { this.stmt.setObject(index, value, type); } public void setObject(int index, Object value) throws SQLException { this.stmt.setObject(index, value); } public int execute() throws SQLException { return this.stmt.executeUpdate(); } }
1. Erstellen Sie eine leere Datenbank und überprüfen Sie die Anzahl der Links
2. Überprüfen Sie die Anzahl der Links unter Linux
und ermitteln Sie die Prozess-ID
Sehen Sie sich die Links zur Linkdatenbank anps aux|grep <your java name>
netstat -apn|grep <your processid>
Einige Fallstricke
Das Obige ist die Konfiguration des Tomcat-Dbcp-Datenbankverbindungspools und einige Fallstricke bei der Verwendung. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!