今天对之前写的servlet程序做了个简单的性能测试发现了一些问题,经过解决这些问题没有再重现,有些问题自己确切知道原因,有的则不太确定。

1、配置文件读取问题

项目中使用.properties作为配置文件,刚开始读取方法如下,使用的是Properties

public  class ConfigHelper {

    private static Properties properties = new Properties();
/***
*
* @param propertyName:属性的key
* @param defaultVal:默认值
* @return 返回配置文件名值,若找不到配置的key,返回默认值
* @throws IOException
*/
public static String getPropertyByKey(String propertyName, String defaultVal) throws IOException {
String fileName = ("/config.properties");
InputStream fin = null;
String value = null;
try {
fin = ConfigHelper.class.getResourceAsStream(fileName);
properties.load(fin);
value = properties.get(propertyName).toString(); } catch (FileNotFoundException e) {
return defaultVal;
} catch (IOException e) {
return defaultVal;
}
finally
{
fin.close();
} return value;
}
}

在没有压力的情况下这种方法是没问题的,但一旦有点并发发现这样使用Properties是有问题的,下图压力测试下出现的问题:

刚开始尝试使用synchronized

public static synchronized String getPropertyByKey(String propertyName, String defaultVal)

当时问题并没有解决,此处省去N个字,最后解决方法如下,声明一个类SafeProperties继承自Properties,该类为单例:

/**
* 读取Properties属性文件
* @author jdzhan
*/
public class SafeProperties extends Properties { /**
*
*/
private static final long serialVersionUID = 1L; private static SafeProperties instance; public static SafeProperties getInstance(String path){
if (instance != null){
return instance;
}else {
makeInstance(path);
return instance;
}
} private static synchronized void makeInstance(String path){
if (instance == null){
instance = new SafeProperties(path);
}
} private SafeProperties(String path){
InputStream is = getClass().getResourceAsStream(path);
try {
load(is);
} catch (IOException ex) {
System.err.println("错误信息: 读取属性文件失败!");
System.err.println("请确认 【"+ path +"】 文件是否存在。");
}
} }

然后在修改ConfigHelper如下:

public class ConfigHelper {

    private static Properties properties = null;

    static{
String fileName = ("/config.properties");
properties=SafeProperties.getInstance(fileName);
} /***
*
* @param propertyName
* :属性的key
* @param defaultVal
* :默认值
* @return 返回配置文件名值,若找不到配置的key,返回默认值
* @throws IOException
*/
public static synchronized String getPropertyByKey(String propertyName, String defaultVal)
throws IOException {
InputStream fin = null;
String value = null;
try {
value = properties.get(propertyName).toString();
} catch (Exception e) {
LogHelper.writeLog("读取配置文件出错:"+ExceptionUtils.getFullStackTrace(e));
return defaultVal;
} finally {
if (fin != null) {
fin.close();
}
} return value;
}
}

2、Mysql:Communications link failure

在压力测试下Mysql也报了一大堆问题,其中有一个问题如下:

这个问题我找到一个比较有参考意义的连接:

http://stackoverflow.com/questions/2121829/mysql-jdbc-communications-link-failure

但是我最后解决这个问题(可能根本没解决)方法是将Mysql的max_connections从1000增加到10000。

3、Mysql:No operations allowed after statement closed.

这个问题折腾我时间最长,结果发现原来是自己代码的问题,因为静态变量的原因,细节不说了。最后得出结论是:这个问题“顾名思义”,一般是因为你后面使用了前面已经关闭的数据库连接造成的。

Eclipse初次java开发问题总结-2的更多相关文章

  1. Eclipse初次java开发问题总结-4-Maven使用问题汇总

    Non-resolvable parent POM [INFO] Scanning for projects... [ERROR] The build could not read 1 project ...

  2. Eclipse初次java开发问题总结-3

    上篇中提到解决的一个问题是mysql驱动报的: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link ...

  3. Jdk1.7+eclipse搭建Java开发环境

    Jdk1.7+eclipse搭建Java开发环境 1.    下载jdk1.7 http://www.oracle.com/technetwork/java/javase/downloads/jdk7 ...

  4. Eclipse For Java开发环境部署

    Eclipse For Java开发环境部署 1.准备工作 jdk安装包 jdk官网下载 Eclipse安装包 Eclipse官网下载 Eclipse下载时选择图中所示的国内镜像地址下载 下载后的文件 ...

  5. Eclipse的Java开发中jar导入后无法使用包内class的解决方案

    请注意, 本方法只对于自己的包有效, 如果你的类内部互相调用, 此方法会失效, 需要每个类文件都进行一次CTRL+SHIFT+O进行包的导入. 如上图的一个结构, algs4.jar和stdlib.j ...

  6. 不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧

    Jerry和SAP成都研究院一些新同事聊天时,谈到ABAP和SAP GUI这个话题.很多新同事在加入SAP成都之前,是做Java和C++开发的,习惯了Eclipse/IntelliJ IDEA/Vis ...

  7. 每个Java开发人员都应该知道的10个基本工具

    大家好,我们已经在2019年的第9个月,我相信你们所有人已经在2019年学到了什么,以及如何实现这些目标.我一直在写一系列文章,为你提供一些关于你可以学习和改进的想法,以便在2019年成为一个更好的. ...

  8. Eclipse for Python开发环境部署

    Eclipse for Python开发环境部署 工欲善其事,必先利其器. 对开发人员来说,顺手的开发工具必定事半功倍.自学编程的小白不知道该选择那个开发工具,Eclipse作为一个功能强大且开源免费 ...

  9. Java开发环境的搭建以及使用eclipse从头一步步创建java项目

    一.java 开发环境的搭建 这里主要说的是在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载最近的JDK即可..http://www.orac ...

随机推荐

  1. the-implementation-of-epoll

    Enhanced Char Driver Operations http://www.xml.com/ldd/chapter/book/ch05.html https://idndx.com/2014 ...

  2. (原创)舌尖上的c++--相逢

    引子 前些时候,我在群里出了一道题目:将变参的类型连接在一起作为字符串并返回出来,要求只用函数实现,不能借助于结构体实现.用结构体来实现比较简单: template<typename... Ar ...

  3. 如何使用IDEA开发工具中右键中的Git图形化工具

    首先,你的项目一定是git服务器上面down下来的,下面来演示如何使用IntelliJ IDEA 开发中在鼠标右键中提供的一个非常方便的图形化Git管理工具: 这里使用的IDEA开发工具的版本是 In ...

  4. 多媒体文件格式之RMVB

    [时间:2016-07] [状态:Open] RM/RMVB是Real公司私有的封装格式,常见的后缀形式是rm.ra.rmvb. 通常封装的都是real转悠的编码格式,比如音频中的sipro.cook ...

  5. JS操作MongoDB

    JavaScript处理MongoDB,更新数据: #!/bin/bash mongo=/home/zhangzhenghai/cluster/mongodb/bin/mongo if true; t ...

  6. Huawei AP3030DN固件升级

    进入uboot: 上电,当出现Press f of F stop Auto-Boot in 3 seconds: 0 时按键盘上的F键 Password for uboot cmd line : 密码 ...

  7. 查看chekpoit文件

    使用tf.train.Saver()保存到checkpoint文件,我们可以用tensorflow查看. # import the inspect_checkpoint library from te ...

  8. myeclipse上传git的问题

    unstaged changes 建好仓库,连接到git之后,在上传代码的时候发现有一些代码是unstaged changes状态.这样的文件是没法上传到git上去的.解决方法是给这些文件增加inde ...

  9. hdu3938(最小生成树,推荐)

    题意描述:简单的讲就是,给你一张无向图,求有多少条路径使得路径上的花费小于L,这里路径上的花费是这样规定的,a.b两点之间的多条路径中的最长的边最小值! 思路:这题目有多个询问,肯定要用离线输出.思路 ...

  10. log4j打印错误异常的详细堆栈信息

    一.问题场景 使用Logger.error方法时只能打印出异常类型,无法打印出详细的堆栈信息,使得定位问题变得困难和不方便. 二.先放出结论 Logger类下有多个不同的error方法,根据传入参数的 ...