热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DBCP数据源配置分析

2019独角兽企业重金招聘Python工程师标准最近在看一些dbcp的相关内容,顺便做一下记录,免得自己给忘记了。1.引入dbcp(选择1.4)J

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 

最近在看一些dbcp的相关内容,顺便做一下记录,免得自己给忘记了。

 

1. 引入dbcp (选择1.4)

Java代码 

 收藏代码

  1.   
  2.     com.alibaba.external  
  3.     jakarta.commons.dbcp  
  4.     1.4  
  5.   

 

2. dbcp的基本配置

 

相关配置说明:

 

  1. initialSize :连接池启动时创建的初始化连接数量(默认值为0)
  2. maxActive :连接池中可同时连接的最大的连接数(默认值为8,调整为20,高峰单机器在20并发左右,自己根据应用场景定)
  3. maxIdle:连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数 上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置)
  4. minIdle:连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为0,调整为5,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;但是不能太大,因为在机器很空闲的时候,也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置)
  5. maxWait  :最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限,调整为60000ms,避免因线程池不够用,而导致请求被无限制挂起)
  6. poolPreparedStatements:开启池的prepared(默认是false,未调整,经过测试,开启后的性能没有关闭的好。)
  7. maxOpenPreparedStatements:开启池的prepared 后的同时最大连接数(默认无限制,同上,未配置)
  8. minEvictableIdleTimeMillis  :连接池中连接,在时间段内一直空闲, 被逐出连接池的时间
  9. (默认为30分钟,可以适当做调整,需要和后端服务端的策略配置相关)
  10. removeAbandonedTimeout  :超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180)
  11. removeAbandoned  :超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true)

 

removeAbandoned参数解释:

  1. 如果开启了removeAbandoned&#xff0c;当getNumIdle() <2) and (getNumActive() > getMaxActive() - 3)时被触发.
  2. 举例当maxActive&#61;20, 活动连接为18,空闲连接为1时可以触发"removeAbandoned".但是活动连接只有在没有被使用的时间超 过"removeAbandonedTimeout"时才被回收
  3. logAbandoned&#xff1a; 标记当连接被回收时是否打印程序的stack traces日志&#xff08;默认为false&#xff0c;未调整&#xff09;

 

一般会是几种情况出现需要removeAbandoned&#xff1a; 

  1. 代码未在finally释放connection , 不过我们都用sqlmapClientTemplate&#xff0c;底层都有链接释放的过程
  2. 遇到数据库死锁。以前遇到过后端存储过程做了锁表操作&#xff0c;导致前台集群中连接池全都被block住&#xff0c;后续的业务处理因为拿不到链接所有都处理失败了。

 

一份优化过的配置&#xff1a;

基本配置代码 

 收藏代码

  1.    
  2.       
  3.       
  4.     xxxx  
  5.         xxxxx  
  6.         20  
  7.         1  
  8.         60000  
  9.         20  
  10.         3  
  11.         true  
  12.         180  
  13.         clientEncoding&#61;GBK  
  14.   

 

 

 

2. dbcp的链接validate配置

  1. dbcp是采用了commons-pool做为其连接池管理&#xff0c;testOnBorrow,testOnReturn, testWhileIdle是pool是提供的几种校验机制&#xff0c;通过外部钩子的方式回调dbcp的相关数据库链接(validationQuery)校验
  2. dbcp相关外部钩子类&#xff1a;PoolableConnectionFactory,继承于common-pool PoolableObjectFactory
  3. dbcp通过GenericObjectPool这一入口&#xff0c;进行连接池的borrow,return处理
  4. testOnBorrow : 顾明思义&#xff0c;就是在进行borrowObject进行处理时&#xff0c;对拿到的connection进行validateObject校验
  5. testOnReturn : 顾明思义&#xff0c;就是在进行returnObject对返回的connection进行validateObject校验&#xff0c;个人觉得对数据库连接池的管理意义不大
  6. testWhileIdle : 关注的重点&#xff0c;GenericObjectPool中针对pool管理&#xff0c;起了一个Evict的TimerTask定时线程进行控制(可通过设置参数timeBetweenEvictionRunsMillis>0),定时对线程池中的链接进行validateObject校验&#xff0c;对无效的链接进行关闭后&#xff0c;会调用ensureMinIdle&#xff0c;适当建立链接保证最小的minIdle连接数。
  7. timeBetweenEvictionRunsMillis,设置的Evict线程的时间&#xff0c;单位ms&#xff0c;大于0才会开启evict检查线程
  8. validateQuery&#xff0c; 代表检查的sql
  9. validateQueryTimeout&#xff0c; 代表在执行检查时&#xff0c;通过statement设置&#xff0c;statement.setQueryTimeout(validationQueryTimeout)
  10. numTestsPerEvictionRun&#xff0c;代表每次检查链接的数量&#xff0c;建议设置和maxActive一样大&#xff0c;这样每次可以有效检查所有的链接.

Validate配置代码 

 收藏代码

  1. true   
  2.     false  
  3.     false  
  4.     select sysdate from dual  
  5.     1  
  6.     30000  
  7.     20  
 相关配置需求&#xff1a;

 

  1. 目前网站的应用大部分的瓶颈还是在I/O这一块&#xff0c;大部分的I/O还是在数据库的这一层面上&#xff0c;每一个请求可能会调用10来次SQL查询&#xff0c;如果不走事务&#xff0c;一个请求会重复获取链接&#xff0c;如果每次获取链接都进行validateObject&#xff0c;性能开销不是很能接受&#xff0c;可以假定一次SQL操作消毫0.5~1ms(一般走了网络请求基本就这数)
  2. 网站异常数据库重启&#xff0c;网络异常断开的频率是非常低的&#xff0c;一般也就在数据库升级&#xff0c;演习维护时才会进行&#xff0c;而且一般也是选在晚上&#xff0c;访问量相对比较低的请求&#xff0c;而且一般会有人员值班关注&#xff0c;所以异步的validateObject是可以接受&#xff0c;但一个前提需要确保能保证在一个合理的时间段内&#xff0c;数据库能完成自动重联。

 

从代码层面简单介绍下dbcp的validate实现&#xff1a;

 

1.  common-pools提供的PoolableObjectFactory&#xff0c;针对pool池的管理操作接口

 

Java代码 

 收藏代码

  1. public interface PoolableObjectFactory {  
  2.   
  3.   Object makeObject() throws Exception;  
  4.   
  5.   void destroyObject(Object obj) throws Exception;  
  6.   
  7.   boolean validateObject(Object obj);  
  8.   
  9.   void activateObject(Object obj) throws Exception;  
  10.   
  11.   void passivateObject(Object obj) throws Exception;  
  12. }  

 

 

2. dbcp实现的pool从池管理操作

 

这里贴了一个相关validate代码&#xff0c;具体类可见&#xff1a;PoolableConnectionFactory.validateConnection()

 

Java代码 

 收藏代码

  1. public class PoolableConnectionFactory implements PoolableObjectFactory {  
  2.   
  3. ......  
  4. public boolean validateObject(Object obj) { //验证validateObject  
  5.         if(obj instanceof Connection) {  
  6.             try {  
  7.                 validateConnection((Connection) obj);  
  8.                 return true;  
  9.             } catch(Exception e) {  
  10.                 return false;  
  11.             }  
  12.         } else {  
  13.             return false;  
  14.         }  
  15.     }  
  16. public void validateConnection(Connection conn) throws SQLException {  
  17.         String query &#61; _validationQuery;  
  18.         if(conn.isClosed()) {  
  19.             throw new SQLException("validateConnection: connection closed");  
  20.         }  
  21.         if(null !&#61; query) {  
  22.             Statement stmt &#61; null;  
  23.             ResultSet rset &#61; null;  
  24.             try {  
  25.                 stmt &#61; conn.createStatement();  
  26.                 if (_validationQueryTimeout > 0) {  
  27.                     stmt.setQueryTimeout(_validationQueryTimeout);  
  28.                 }  
  29.                 rset &#61; stmt.executeQuery(query);  
  30.                 if(!rset.next()) {  
  31.                     throw new SQLException("validationQuery didn&#39;t return a row");  
  32.                 }  
  33.             } finally {  
  34.                 if (rset !&#61; null) {  
  35.                     try {  
  36.                         rset.close();  
  37.                     } catch(Exception t) {  
  38.                         // ignored  
  39.                     }  
  40.                 }  
  41.                 if (stmt !&#61; null) {  
  42.                     try {  
  43.                         stmt.close();  
  44.                     } catch(Exception t) {  
  45.                         // ignored  
  46.                     }  
  47.                 }  
  48.             }  
  49.         }  
  50.     }  
  51.   
  52. ....  
  53.   
  54. }  

 

3. pool池的evict调用代码&#xff1a;GenericObjectPool (apache commons pool version 1.5.4)

Java代码 

 收藏代码

  1. protected synchronized void startEvictor(long delay) { //启动Evictor为TimerTask  
  2.         if(null !&#61; _evictor) {  
  3.             EvictionTimer.cancel(_evictor);  
  4.             _evictor &#61; null;  
  5.         }  
  6.         if(delay > 0) {  
  7.             _evictor &#61; new Evictor();  
  8.             EvictionTimer.schedule(_evictor, delay, delay);  
  9.         }  
  10.     }  
  11.   
  12. for (int i&#61;0,m&#61;getNumTests();i
  13.             final ObjectTimestampPair pair;  
  14.            .......  
  15.             boolean removeObject &#61; false;  
  16.             // 空闲链接处理  
  17.             final long idleTimeMilis &#61; System.currentTimeMillis() - pair.tstamp;  
  18.             if ((getMinEvictableIdleTimeMillis() > 0) &&  
  19.                     (idleTimeMilis > getMinEvictableIdleTimeMillis())) {  
  20.                 removeObject &#61; true;  
  21.             } else if ((getSoftMinEvictableIdleTimeMillis() > 0) &&  
  22.                     (idleTimeMilis > getSoftMinEvictableIdleTimeMillis()) &&  
  23.                     ((getNumIdle() &#43; 1)> getMinIdle())) {   
  24.                 removeObject &#61; true;  
  25.             }  
  26.             //  testWhileIdle sql 检查处理  
  27.             if(getTestWhileIdle() && !removeObject) {  
  28.                 boolean active &#61; false;  
  29.                 try {  
  30.                     _factory.activateObject(pair.value);  
  31.                     active &#61; true;  
  32.                 } catch(Exception e) {  
  33.                     removeObject&#61;true;  
  34.                 }  
  35.                 if(active) {  
  36.                     if(!_factory.validateObject(pair.value)) {   
  37.                         removeObject&#61;true;  
  38.                     } else {  
  39.                         try {  
  40.                             _factory.passivateObject(pair.value);  
  41.                         } catch(Exception e) {  
  42.                             removeObject&#61;true;  
  43.                         }  
  44.                     }  
  45.                 }  
  46.             }  
  47.             // 真正关闭  
  48.             if (removeObject) {  
  49.                 try {  
  50.                     _factory.destroyObject(pair.value);  
  51.                 } catch(Exception e) {  
  52.                     // ignored  
  53.                 }  
  54.             }  
  55.           ........  

 

 

注意&#xff1a; 目前dbcp的pool的实现是使用了公用的apache common pools进行扩展处理&#xff0c;所以和原生的连接池处理&#xff0c;代码看上去有点别扭&#xff0c;感觉自动重连这块异常处理不怎么好&#xff0c;我也就只重点关注了这部分代码而已   .

 

 

3. dbcp的链接自动重链相关测试

相关场景&#xff1a;

  1. 数据库意外重启后&#xff0c;原先的数据库连接池能自动废弃老的无用的链接&#xff0c;建立新的数据库链接
  2. 网络异常中断后&#xff0c;原先的建立的tcp链接&#xff0c;应该能进行自动切换

测试需求1步骤

  1. 建立一testCase代码
  2. 配置mysql数据库
  3. 循环执行在SQL查询过程
  4. 异常重启mysql数据库

测试需求2步骤

  1. 建立一testCase代码
  2. 配置mysql数据库
  3. 循环执行在SQL查询过程
  4. 通过iptables禁用网络链接 

/sbin/iptables -A INPUT -s 10.16.2.69 -j REJECT
/sbin/iptables -A FORWARD -p tcp -s 10.16.2.69 --dport 3306 -m state --state NEW,ESTABLISHED -j DROP

     5. iptables -F 清空规则&#xff0c;恢复链接通道。

 

测试需求问题记录

 

分别测试了两种配置&#xff0c;有validateObject的配置和没有validateObject的相关配置。

1. 没有validate配置
问题一&#xff1a; 异常重启mysql数据库后&#xff0c;居然也可以自动恢复链接&#xff0c;sql查询正常
跟踪了一下代码&#xff0c;发现这么一个问题&#xff1a;

  1. 在数据库关闭的时候&#xff0c;client中pool通过borrowObject获取一个异常链接返回给client
  2. client在使用具体的异常链接进行sql调用出错了&#xff0c;抛了异常
  3. 在finally&#xff0c;调用connection.close()&#xff0c;本意是应该调用pool通过returnObject返回到的池中&#xff0c;但在跟踪代码时&#xff0c;未见调用GenericObjectPool的returnObject
  4. 继续查&#xff0c;发现在dbcp在中PoolingDataSource(实现DataSource接口)调用PoolableConnection(dbcp pool相关的delegate操作)进行相应关闭时&#xff0c;会检查_conn.isClosed()&#xff0c;针对DataSource如果isClosed返回为true的则不调用returnObject&#xff0c;直接丢弃了链接  

解释&#xff1a;

  • 正因为在获取异常链接后&#xff0c;因为做了_conn.isClosed()判断&#xff0c;所以异常链接并没有返回到连接池中&#xff0c;所以到数据库重启恢复后&#xff0c;每次都是调用pool重新构造一个新的connection&#xff0c;所以后面就正常了
  • _conn.isClosed()是否保险&#xff0c;从jdk的api描述中&#xff1a; A connection is closed if the method close has been called on it or if certain fatal errors have occurred. 里面提供两种情况&#xff0c;一种就是被调用了closed方法&#xff0c;另一种就是出现一些异常也说的比较含糊。

问题二&#xff1a;validateObject调用时&#xff0c;dbcp设置的validationQueryTimeout居然没效果

看了mysql statement代码实现&#xff0c;找到了答案。 

mysql com.mysql.jdbc.statemen 部分代码

 

timeout时间处理&#xff1a;

Java代码 

 收藏代码

  1. timeoutTask &#61; new CancelTask();  
  2. //通过TimerTask启动一定时任务  
  3. Connection.getCancelTimer().schedule(timeoutTask,  this.timeoutInMillis);  

 

对应的CancelTask的代码&#xff1a; 

 

Java代码 

 收藏代码

  1. class CancelTask extends TimerTask {  
  2.   
  3.         long connectionId &#61; 0;  
  4.   
  5.         CancelTask() throws SQLException {  
  6.             connectionId &#61; connection.getIO().getThreadId();  
  7.         }  
  8.   
  9.         public void run() {  
  10.   
  11.             Thread cancelThread &#61; new Thread() {  
  12.   
  13.                 public void run() {  
  14.                     Connection cancelConn &#61; null;  
  15.                     java.sql.Statement cancelStmt &#61; null;  
  16.   
  17.                     try {  
  18.                         cancelConn &#61; connection.duplicate();  
  19.                         cancelStmt &#61; cancelConn.createStatement();  
  20.                                                 // 简单暴力&#xff0c;再发起一条KILL SQL&#xff0c;关闭先前的sql thread id  
  21.                         cancelStmt.execute("KILL QUERY " &#43; connectionId);  
  22.                         wasCancelled &#61; true;  
  23.                     } catch (SQLException sqlEx) {  
  24.                         throw new RuntimeException(sqlEx.toString());  
  25.                     } finally {  
  26.                         if (cancelStmt !&#61; null) {  
  27.                             try {  
  28.                                 cancelStmt.close();  
  29.                             } catch (SQLException sqlEx) {  
  30.                                 throw new RuntimeException(sqlEx.toString());  
  31.                             }  
  32.                         }  
  33.   
  34.                         if (cancelConn !&#61; null) {  
  35.                             try {  
  36.                                 cancelConn.close();  
  37.                             } catch (SQLException sqlEx) {  
  38.                                 throw new RuntimeException(sqlEx.toString());  
  39.                             }  
  40.                         }  
  41.                     }  
  42.                 }  
  43.             };  
  44.   
  45.             cancelThread.start();  
  46.         }  
  47.     }  

 

 

原因总结一句话&#xff1a; queryTimeout的实现是通过底层数据库提供的机制&#xff0c;比如KILL QUERY pid.  如果此时的网络不通&#xff0c;出现阻塞现象&#xff0c;对应的kill命令也发不出去&#xff0c;所以timeout设置的超时没效果。

4.最后

最后还是决定配置testWhileIdle扫描&#xff0c;主要考虑&#xff1a;

  1. pool池中的链接如果未被使用&#xff0c;可以通过testWhileIdle进行链接检查&#xff0c;避免在使用时后总要失败那么一次&#xff0c;可以及时预防
  2. 配合连接池的minEvictableIdleTimeMillis(空闲链接)&#xff0c;removeAbandoned(未释放的链接)&#xff0c;可以更好的去避免因为一些异常情况引起的问题&#xff0c;防范于未然。比如使用一些分布式数据库的中间件&#xff0c;会有空闲链接关闭的动作&#xff0c;动态伸缩连接池&#xff0c;这时候需要能及时的发现&#xff0c;避免请求失败。
  3. testOnBorrow个人不太建议使用&#xff0c;存在性能问题&#xff0c;试想一下连接一般会在什么情况出问题&#xff0c;网络或者服务端异常终端空闲链接&#xff0c;网络中断你testOnBorrow检查发现不对再取一个链接还是不对&#xff0c;针对空闲链接处理异常关闭&#xff0c;可以从好业务端的重试策略进行考虑&#xff0c;同时配置客户端的空闲链接超时时间&#xff0c;maxIdle,minIdle等。

 

--------------------------------------------

新加的内容&#xff1a;

 

5.dbcp密码加密处理

以前使用jboss的jndi数据源的方式&#xff0c;是通过配置oracle-ds.xml&#xff0c;可以设置EncryptDBPassword&#xff0c;引用jboss login-config.xml配置的加密配置。

 

 

Java代码 

 收藏代码

  1.   
  2.           
  3.               
  4.                 ${username}  
  5.                 ${password_encrypt}  
  6.                 jboss.jca:service&#61;LocalTxCM,name&#61;${jndiName}  
  7.               
  8.           
  9.       

 

 

为了能达到同样的效果&#xff0c;切换为spring dbcp配置时&#xff0c;也有类似密码加密的功能&#xff0c;运行期进行密码decode,最后进行数据链接。

 

 

实现方式很简单&#xff0c;分析jboss的对应SecureIdentityLoginModule的实现&#xff0c;无非就是走了Blowfish加密算法&#xff0c;自己拷贝实现一份。

 

 

Java代码 

 收藏代码

  1. private static String encode(String secret) throws NoSuchPaddingException, NoSuchAlgorithmException,  
  2.                                                InvalidKeyException, BadPaddingException, IllegalBlockSizeException {  
  3.         byte[] kbytes &#61; "jaas is the way".getBytes();  
  4.         SecretKeySpec key &#61; new SecretKeySpec(kbytes, "Blowfish");  
  5.   
  6.         Cipher cipher &#61; Cipher.getInstance("Blowfish");  
  7.         cipher.init(Cipher.ENCRYPT_MODE, key);  
  8.         byte[] encoding &#61; cipher.doFinal(secret.getBytes());  
  9.         BigInteger n &#61; new BigInteger(encoding);  
  10.         return n.toString(16);  
  11.     }  
  12.   
  13.     private static char[] decode(String secret) throws NoSuchPaddingException, NoSuchAlgorithmException,  
  14.                                                InvalidKeyException, BadPaddingException, IllegalBlockSizeException {  
  15.         byte[] kbytes &#61; "jaas is the way".getBytes();  
  16.         SecretKeySpec key &#61; new SecretKeySpec(kbytes, "Blowfish");  
  17.   
  18.         BigInteger n &#61; new BigInteger(secret, 16);  
  19.         byte[] encoding &#61; n.toByteArray();  
  20.   
  21.         Cipher cipher &#61; Cipher.getInstance("Blowfish");  
  22.         cipher.init(Cipher.DECRYPT_MODE, key);  
  23.         byte[] decode &#61; cipher.doFinal(encoding);  
  24.         return new String(decode).toCharArray();  
  25.     }  

 

最后的配置替换为&#xff1a;

 

 

Xml代码 

 收藏代码

  1.    
  2. ......  
  3.           
  4.               
  5.                   
  6.               
  7.           
  8. ........  
  9.   

 

--------------------------------------------

新加的内容&#xff1a;

6.数据库重连机制

常见的问题&#xff1a;

1. 数据库意外重启后&#xff0c;原先的数据库连接池能自动废弃老的无用的链接&#xff0c;建立新的数据库链接

2. 网络异常中断后&#xff0c;原先的建立的tcp链接&#xff0c;应该能进行自动切换。比如网站演习中的交换机重启会导致网络瞬断

3. 分布式数据库中间件&#xff0c;比如amoeba会定时的将空闲链接异常关闭&#xff0c;客户端会出现半开的空闲链接。

 

大致的解决思路&#xff1a;  

1. sql心跳检查

  主动式 ,即我前面提到的sql validate相关配置

2. 请求探雷

    牺牲小我&#xff0c;完成大我的精神。 拿链接尝试一下&#xff0c;发现处理失败丢弃链接&#xff0c;探雷的请求总会失败几个&#xff0c;就是前面遇到的问题一&#xff0c;dbcp已经支持该功能&#xff0c;不需要额外置。

3. 设置合理的超时时间&#xff0c;

      解决半开链接. 一般数据库mysql,oracle都有一定的链接空闲断开的机制&#xff0c;而且当你使用一些分布式中间件(软件一类的)&#xff0c;空闲链接控制会更加严格&#xff0c;这时候设置合理的超时时间可以有效避免半开链接。

     一般超时时间&#xff0c;dbcp主要是minEvictableIdleTimeMillis(空闲链接) , removeAbandonedTimeout(链接泄漏)。可以见前面的参数解释。

参考文献&#xff1a;http://agapple.iteye.com/blog/772507


转:https://my.oschina.net/u/3729778/blog/1601503



推荐阅读
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • 2018深入java目标计划及学习内容
    本文介绍了作者在2018年的深入java目标计划,包括学习计划和工作中要用到的内容。作者计划学习的内容包括kafka、zookeeper、hbase、hdoop、spark、elasticsearch、solr、spring cloud、mysql、mybatis等。其中,作者对jvm的学习有一定了解,并计划通读《jvm》一书。此外,作者还提到了《HotSpot实战》和《高性能MySQL》等书籍。 ... [详细]
  • 先看一段错误日志:###Errorqueryingdatabase.Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransie ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
author-avatar
你不必害怕q因为我会发光
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有