如何使用Singleton提高java web应用程序的性能
我使用单例来增加数据库连接的响应。 但是,当有许多用户同时发送请求时,一个连接的实例会造成瓶颈,因此我在如何使用Singleton提高java web应用程序的性能,java,jakarta-ee,web-applications,singleton,Java,Jakarta Ee,Web Applications,Singleton,我使用单例来增加数据库连接的响应。 但是,当有许多用户同时发送请求时,一个连接的实例会造成瓶颈,因此我在getInstance()方法中使用另一种方法: public class jjDatabaseWeb { private static final DatabaseType dbType = DatabaseType.MySql; private static String password; private ResultSet resultSet; pri
getInstance()
方法中使用另一种方法:
public class jjDatabaseWeb {
private static final DatabaseType dbType = DatabaseType.MySql;
private static String password;
private ResultSet resultSet;
private static String serverHost = "127.0.0.1"; //localhost";
private static String port = "3306";
private static String databaseName = "db_university";
static String url2;
private Connection connection;
private static jjDatabaseWeb accessor;
private static jjDatabaseWeb accessor2;
private static jjDatabaseWeb accessor3;
private static jjDatabaseWeb accessor4;
private static jjDatabaseWeb accessor5;
private static jjDatabaseWeb accessor6;
private static jjDatabaseWeb accessor7;
private static jjDatabaseWeb accessor8;
private static jjDatabaseWeb accessor9;
private static jjDatabaseWeb accessor10;
private static int counter = 0;
private static int counter2 = 0;
private jjDatabaseWeb() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_university?characterSetResults=UTF-8&characterEncoding=UTF-8&useUnicode=yes", "root", "m123456");
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
System.out.println("database driver name is ok");
}
public static synchronized jjDatabaseWeb getInstance() throws SQLException, ClassNotFoundException {
counter++;
System.out.println("+++++=====>>>> number of connection user" + counter);
if (accessor == null) {
System.out.println("############################################");
System.out.println("NEW DB CONNECTION 1 ");
System.out.println("############################################");
accessor = new jjDatabaseWeb();
}
if (counter > 7) {
System.out.println("-------------------------------" + counter2);
counter2++;
if (counter2 % 10 == 1) {
if (accessor2 == null) {
System.out.println("############################################");
System.out.println("NEW DB CONNECTION 2");
System.out.println("############################################");
accessor2 = new jjDatabaseWeb();
}
return accessor2;
}
if (counter2 % 10 == 2) {
if (accessor3 == null) {
System.out.println("############################################");
System.out.println("NEW DB CONNECTION 3");
System.out.println("############################################");
accessor3 = new jjDatabaseWeb();
}
return accessor3;
}
if (counter2 % 10 == 3) {
if (accessor4 == null) {
System.out.println("############################################");
System.out.println("NEW DB CONNECTION 4");
System.out.println("############################################");
accessor4 = new jjDatabaseWeb();
}
return accessor4;
}
if (counter2 % 10 == 4) {
if (accessor5 == null) {
System.out.println("############################################");
System.out.println("NEW DB CONNECTION 5");
System.out.println("############################################");
accessor5 = new jjDatabaseWeb();
}
return accessor5;
}
if (counter2 % 10 == 5) {
if (accessor6 == null) {
System.out.println("############################################");
System.out.println("NEW DB CONNECTION 6");
System.out.println("############################################");
accessor6 = new jjDatabaseWeb();
}
return accessor6;
}
if (counter2 % 10 == 6) {
if (accessor7 == null) {
System.out.println("############################################");
System.out.println("NEW DB CONNECTION 7");
System.out.println("############################################");
accessor7 = new jjDatabaseWeb();
}
return accessor7;
}
if (counter2 % 10 == 7) {
if (accessor8 == null) {
System.out.println("############################################");
System.out.println("NEW DB CONNECTION 8");
System.out.println("############################################");
accessor8 = new jjDatabaseWeb();
}
return accessor8;
}
if (counter2 % 10 == 8) {
if (accessor9 == null) {
System.out.println("############################################");
System.out.println("NEW DB CONNECTION 9");
System.out.println("############################################");
accessor9 = new jjDatabaseWeb();
}
return accessor9;
}
if (counter2 % 10 == 9) {
if (accessor10 == null) {
System.out.println("############################################");
System.out.println("NEW DB CONNECTION 10");
System.out.println("############################################");
accessor10 = new jjDatabaseWeb();
}
return accessor10;
}
}
counter2 = 0;
return accessor;
}
}
我从不关闭连接并使用singleton,
它有一些好处
- 如果创建了连接,则新连接不会产生,因此获取数据的速度更快(建立连接很耗时)
- 在非繁忙时间,我们有一个连接是单音模式,如果有最多7个并发请求,则程序获取一个连接的实例
- 在繁忙时间,当有许多请求等待一个连接时,它会创建9个其他连接,并在它们之间共享新的请求
Java调用目标异常
注意,在输出中我看到计数器=28(这意味着峰值任务中有28,27个等待连接)
第一次运行批处理请求没有问题,但当我重复测试时,它有一些错误原因,即堆空间不足。我认为最好让应用程序服务器通过其连接池为您处理连接(您可以从应用程序服务器配置中设置最小和最大连接池).使用连接池!最好使用ApacheDBCP之类的连接池。寻找更多关于X-Y问题的信息。这个问题可能不会得到答案,因为您的问题的解决方案是:不要重新发明轮子(尝试失败)。您的代码看起来像是Java的初学者:到处都使用静态代码(这使得单元测试非常困难;因此您似乎没有测试代码,这也是一件坏事)。然后,您似乎没有听说过数组或Java集合;没有人应该开始给变量命名,比如a1、a2、a3;然后像你在那里那样有节奏感。长话短说:在你尝试建立一个真实世界的项目供其他人使用之前:花一些时间学习基本的java基础知识。顺便说一句:什么动作会减少你的计数器?亲爱的Jägermeister fast judge,我可以使用数组,但“使用数组”不是我的问题。另一方面,我的服务器在数据库连接方面有限制(最多10个)。其他人发现了所有的问题,并说出了他们的想法。如果你没有解决办法,你就不会被迫说,亲爱的Jägermeister。