Heim  >  Artikel  >  Datenbank  >  Konfiguration des Tomcat-dbcp-Datenbankverbindungspools und einige Fallstricke bei der Verwendung

Konfiguration des Tomcat-dbcp-Datenbankverbindungspools und einige Fallstricke bei der Verwendung

黄舟
黄舟Original
2017-03-02 16:44:011586Durchsuche

1. Datenbankverbindungspool

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

enthält tomcat-dbcp.jar. Der Rest sind einige Basispakete

3. Verwendete Konfigurationen

Diese Konfigurationen müssen nur in 99e7097f1664fb801758bd29e9eccbe5.properties platziert werden, etwa Die Bedeutung der einzelnen
dbname.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最大的活动链接数,如果是多线程可以设置为超出多线程个数个链接数
3. Verbindungspoolcode
<pre name="code" class="java">validationQuery测试是否连接是有效的sql语句

Das Obige ist der Der bei der Verwendung des Thread-Pools verwendete Code gibt nur eine grobe Möglichkeit, ihn zu schreiben. Der spezifische DBDAO-Teil muss entsprechend Ihren eigenen Anforderungen implementiert werden, z. B. Stapelverarbeitung, Abfrage, Aktualisierung und andere Funktionen Wie können Sie also beurteilen, ob der von Ihnen erstellte Link Ihren Wünschen entspricht? Es gibt zwei Möglichkeiten, dies zu überprüfen:
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 an
ps aux|grep <your java name>

Sie können die spezifische Anzahl der Links sehen, um zu überprüfen, ob Ihr Linkpool korrekt ist
netstat -apn|grep <your processid>



Einige Fallstricke

Da es in Multithread-Form verwendet wird, ist die Verwendung von Static die größte Gefahr, da ich damit nicht allzu vertraut bin. Die Nichtverwendung von Statik führte dazu, dass jeder Thread einen Datenbankverbindungspool herstellte und der Fehler „Zu viele Dateien geöffnet“ auftrat. Dies wurde dadurch verursacht, dass im Thread-Pool keine Statik verwendet wurde.

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)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn