如何使用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个其他连接,并在它们之间共享新的请求

我在错误的条件下测试它,并在一秒钟内从3个不同的浏览器向一个方法发送40个请求,这需要2分钟,但当我只使用singleton时,大约需要6分钟

但是当我重复这个测试时,一些请求出现了一些错误,比如“堆空间错误”和
Java调用目标异常

注意,在输出中我看到计数器=28(这意味着峰值任务中有28,27个等待连接)


第一次运行批处理请求没有问题,但当我重复测试时,它有一些错误原因,即堆空间不足。

我认为最好让应用程序服务器通过其连接池为您处理连接(您可以从应用程序服务器配置中设置最小和最大连接池).

使用连接池!最好使用ApacheDBCP之类的连接池。寻找更多关于X-Y问题的信息。这个问题可能不会得到答案,因为您的问题的解决方案是:不要重新发明轮子(尝试失败)。您的代码看起来像是Java的初学者:到处都使用静态代码(这使得单元测试非常困难;因此您似乎没有测试代码,这也是一件坏事)。然后,您似乎没有听说过数组或Java集合;没有人应该开始给变量命名,比如a1、a2、a3;然后像你在那里那样有节奏感。长话短说:在你尝试建立一个真实世界的项目供其他人使用之前:花一些时间学习基本的java基础知识。顺便说一句:什么动作会减少你的计数器?亲爱的Jägermeister fast judge,我可以使用数组,但“使用数组”不是我的问题。另一方面,我的服务器在数据库连接方面有限制(最多10个)。其他人发现了所有的问题,并说出了他们的想法。如果你没有解决办法,你就不会被迫说,亲爱的Jägermeister。