摘要: 以下是一个小应用的数据库连接池配置,包括DBCP和C3P0的配制方法因为是小应用,完全不涉及访问压力,所以配置上采取尽量节约数据库资源的方式具体要求如下:初始化连接数为0连接不够,需要新创建时,每次创建1个尽快回收空闲连接需要开启prepareStatement缓存具体用代码来说明 1 package com.yazuo.util; 2 3 import com.mchange.v2.c3p0.ComboPooledDataSource; 4 import org.apache.commons.dbcp.BasicDataSource; 5 import org.slf4j.Logger; . 阅读全文
posted @ 2013-07-12 14:28 baibaluo 阅读(715) 评论(1) 推荐(0) 编辑
摘要: 以前在开发时只知道依靠数据库事务来保证程序关闭时数据的完整性。但有些时候一个业务上要求的原子操作,不一定只包括数据库,比如外部接口或者消息队列。此时数据库事务就无能为力了。这时我们可以依靠java提供的一个工具方法:java.lang.Runtime.addShutdownHook(Thread hook)addShutdownHook方法可以加入一个钩子,在程序退出时触发该钩子。(退出是指ctrl+c或者kill -15,但如果用kill -9 那是没办法的,具体有关kill的signal机制有篇大牛的文章《Linux 信号signal处理机制》)钩子做什么操作都可以,甚至可以循环检查某个线 阅读全文
posted @ 2013-07-12 11:12 baibaluo 阅读(14912) 评论(0) 推荐(1) 编辑
摘要: 公司有一个应用,多个线程从activeMQ中取消息,随着业务的扩大,该机器占用的网络带宽越来越高。仔细分析发现,mq入队时并没有异常高的网络流量,仅仅在出队时会产生很高的网络流量。最终发现是spring的jmsTemplate与activemq的prefetch机制配合导致的问题。研究源码发现jmsTemplate实现机制是:每次调用receive()时都会创建一个新的consumer对象,用完即销毁。正常情况下仅仅会浪费重复创建consumer的资源代价,并不至于产生正常情况十倍百倍的网络流量。但是activeMQ有一个提高性能的机制prefetch,此时就会有严重的问题。prefetch. 阅读全文
posted @ 2012-12-24 14:23 baibaluo 阅读(5546) 评论(2) 推荐(0) 编辑
摘要: linux下find命令find /yazuo_apps/crm35/current -name *.sh;此命令在某些情况下不能顺利找到/yazuo_apps/crm35/current下的*.sh文件-name后面的参数 *.sh 并不一定会直接传给 find命令,而是现在当前目录下进行匹配根据当前目录的匹配情况,可能有一下三种可能:1、当前目录不存在*.sh,此时shell会顺利的把 *.sh传递给find命令,此时一切顺利。2、当目录存在一个abc.sh时,shell命令实际变为 find /yazuo_apps/crm35/current -name abc.sh;3、当前目录存在多 阅读全文
posted @ 2012-08-16 15:16 baibaluo 阅读(8843) 评论(1) 推荐(1) 编辑
摘要: sshpass -p 'password' ssh -o StrictHostKeyChecking=no root@192.168.x.x 'echo webadmin:newpassword|chpasswd'sshpass可以帮我们用明文密码的方式直接ssh到远程机器的小工具。下载去google搜索到官网下就行了。 阅读全文
posted @ 2012-08-02 13:23 baibaluo 阅读(492) 评论(0) 推荐(0) 编辑
摘要: 以前写sql的时候总是担心current()得到的值并不会绝对等于我上一次nextval()取得的值;因为可能其他线程并发访问nextval()。先说结论吧:当你拿到一个数据库连接,先nextval(),然后无论其他再怎么操作这个sequence,你用current()取得的值一直都会与你刚才nextval()的取值相同此时才明白了为什么当我想在数据库中直接查看某个sequence的currval时,报错,必须要先nextval(),才能执行currval()我做了一个实验,用同一个用户开两个数据库连接A、B第一步用连接A调用nextval(),取得值为1用连接A调用current(),取得值 阅读全文
posted @ 2012-01-31 12:59 baibaluo 阅读(1157) 评论(0) 推荐(0) 编辑
摘要: NIO提到这个词,很多人会条件反射的说出这样的话:“非阻塞IO,速度快!”。但是为什么非阻塞IO,就会比阻塞式IO速度快呢?下面用一个普遍的例子形容一下阻塞io与非阻塞io的工作方式有一个读取数据的任务A。阻塞io工作方式:1、尝试读取数据2、如果数据没有准备完成(在web等工作环境下,经常出现此情况),重复步骤13、直到读取数据完成后,返回。非阻塞io工作方式:1、尝试读取数据2、如果数据没有准备完成,返回失败。如果数据准备完毕,读取后返回。根据两种工作方式,稍加思考大家都会明白他们的优劣,而不是简单的说出那句条件反射的话。。。下面分析一下:阻塞io的工作方式简单明了,符合常理,非常容易理解 阅读全文
posted @ 2011-12-28 15:49 baibaluo 阅读(6280) 评论(1) 推荐(3) 编辑
摘要: 虽然写起动shell的频率非常不高。。。但是每次要写都要对付一大堆的jar文件路径,新加jar包也必须要修改起动shell。在网上找到一个挺好的通用shell脚本。只需要修改一些配置变量,就可以用来做起动脚本了。并且除了能起动、还支持关闭、重启、查看是否正在运行的功能。原文地址:http://www.tudaxia.com/archives/10start函数中,nohup部分其实也可以提出来放入一个配置变量中。这里没有修改直接贴上作者的原文#!/bin/sh#该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用,#也可以作为启动java程序的独立脚本来 阅读全文
posted @ 2011-08-31 16:52 baibaluo 阅读(9858) 评论(1) 推荐(1) 编辑
摘要: tomcat 6的Connector配置如下<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="800" acceptCount="1000"/>其中最后两个参数意义如下:maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200acceptCount:当tomcat起动的线程数达到最大 阅读全文
posted @ 2011-08-23 10:51 baibaluo 阅读(56324) 评论(3) 推荐(4) 编辑
摘要: 以前一直用log4j每天都写log.debug(XXX)log.error(XXX),当XXX部分包含的内容是由多个变量组合得到时,就用"XXX" + "YYY" + "ZZZ",虽然知道拼接字符串的效率不好,但是也没有去试图找更好的办法。今天看到同事的代码里这样写的(用的是slf4j)log.error("根据卡类型和面值无法找到对应卡[{}][{}]", new String[]{"001", "30"});这样能够非常优雅的就把后面的两个参数001和30拼接到前面的st 阅读全文
posted @ 2011-06-28 16:32 baibaluo 阅读(687) 评论(0) 推荐(1) 编辑