Lors du développement, il est souvent nécessaire d'effectuer certaines opérations sur la base de données, telles que des ajouts, suppressions, modifications et requêtes courants. les données sont petites, elles peuvent être exploitées directement, mais lorsque la quantité de données augmente, chaque connexion et libération de la base de données prendra un certain temps. À ce stade, le pool de connexions à la base de données peut être utilisé pour maintenir le lien avec la base de données. réduire la surcharge causée par la connexion à la base de données sur le programme, et cela peut réduire la pression sur la base de données, alors qu'est-ce que le pool de connexion à la base de données ? Comme son nom l'indique, il s'agit d'un étang. Ce qui est placé dans l'étang est un lien vers la base de données. Par exemple, un étang à poissons est un étang pour élever du poisson, vous pouvez le pêcher directement. Vous n'avez pas besoin d'acheter des alevins et d'élever du poisson vous-même. La base de données Le pool de connexions est utilisé pour stocker les liens vers la base de données. Lorsqu'ils sont utilisés, vous pouvez les récupérer directement. Après utilisation, vous pouvez les mettre. retour dans le pool. Puisque vous utilisez cette chose, nous n'avons pas besoin d'écrire le code nous-mêmes. Certains pools de connexion open source peuvent être utilisés directement, c3p0, dbcp et proxool. Je n'ai jamais utilisé c3p0 et proxool, c'est simple, j'ai utilisé le pool dbcp, je vais parler ici de la façon d'utiliser le pool de connexion à la base de données dbcp et de quelques pièges rencontrés lors de son utilisation
Figure 1, avant d'utiliser le pool de connexion
Figure 2 Après avoir utilisé le pool de connexion
Comme le montre la figure 1 ci-dessus, avant d'utiliser le pool de connexion, vous devez Un lien est établi avec la base de données à chaque fois et doit être libéré à tout moment. Lorsque la quantité de données est importante, la connexion à la base de données nécessite beaucoup de temps système. et l'accès et la libération fréquents de la base de données exerceront également beaucoup de pression sur la base de données. La figure 2 montre qu'après avoir utilisé le pool de connexions à la base de données, tous les liens sont placés dans le pool sans les libérer. Lorsqu'ils sont utilisés, ils sont directement extraits. le pool et remis dans le pool après utilisation. Le pool maintient des liens longs vers la base de données, si le lien est déconnecté, il se reconnectera automatiquement si la connexion n'est pas suffisante, les utilisateurs suivants devront attendre
contient tomcat-dbcp.jar Voilà, le reste sont quelques packages de base
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
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(); } }
ps aux|grep <your java name>
Afficher les liens vers la base de données de liens
netstat -apn|grep <your processid>
Vous pouvez voir le nombre spécifique de liens pour vérifier si votre pool de liens est correct
Comme il est utilisé sous forme multithread, le piège le plus important rencontré est l'utilisation du statique, car je ne le connais pas trop, ne pas utiliser static, chaque thread établissait un pool de connexions à la base de données et une erreur « trop de fichiers ouverts » s'est produite en raison de la non-utilisation de static dans le pool de threads.
Ce qui précède est la configuration du pool de connexion à la base de données Tomcat-dbcp et quelques pièges lors de son utilisation. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !