Java 在web应用程序中管理数据库连接的最佳实践

Java 在web应用程序中管理数据库连接的最佳实践,java,mongodb,design-patterns,database,Java,Mongodb,Design Patterns,Database,我正在用Java开发MongoDB应用程序,但我认为这个问题通常与web应用程序的数据存储连接有关 我喜欢用四个顶级软件包来构建所有web应用程序,这些软件包被称为(我认为这是不言自明的): 控制器 模型 刀 利用率 理想情况下,我希望在Dao包中有一个类来处理所有连接细节 到目前为止,我创建了一个如下所示的类: public class Dao { public static Mongo mongo; public static DB database; public static D

我正在用Java开发MongoDB应用程序,但我认为这个问题通常与web应用程序的数据存储连接有关

我喜欢用四个顶级软件包来构建所有web应用程序,这些软件包被称为(我认为这是不言自明的):

  • 控制器
  • 模型
  • 利用率
理想情况下,我希望在Dao包中有一个类来处理所有连接细节

到目前为止,我创建了一个如下所示的类:

public class Dao {

public static Mongo mongo;
public static DB database;

public static DB getDB() throws UnknownHostException, MongoException{
    mongo = new Mongo("localhost");
    database = mongo.getDB("mydb");
    return database;
    }

public static void closeMongo(){
    mongo.close();
    } 
}
我在我的代码中使用它

public static void someMethod(String someData){
    try {
        DB db = Dao.getDB();
        DBCollection rColl = db.getCollection("mycollection");      
        // perform some database operations
        Dao.closeMongo();

    } catch (UnknownHostException e) { e.printStackTrace(); } catch (MongoException e) { e.printStackTrace(); 
    }
}

这似乎很好,但我想知道人们认为处理这个问题的“最佳”方法是什么,如果有这样的事情的话。

我建议您可以编写一个java类来建立与数据库的连接

方法的参数应该是
数据库名称
密码
主机端口
和其他必要的凭据


在需要建立数据库连接的任何地方,都可以调用参数化构造函数。这可以是一个模型。

连接到关系数据库服务器时的经验法则是拥有一个池。例如,如果使用池连接到oracle数据库,则在连接设置时间和sql解析时间(如果使用绑定变量)方面都会带来一些性能优势。其他关系数据库可能会有所不同,但我的观点是,即使出于某些其他原因(例如,您可能希望限制与db用户的最大连接数),池也是一种很好的模式。您正在使用MongoDB,因此首先要检查MongoDB如何处理连接、创建连接的开销等。我建议使用/构建一个可以实现池逻辑的类,因为它为您提供了将来可能需要的灵活性。看看你的代码,似乎你的api

DB db=Dao.getDB();
应搭配:

Dao.closeDB(DB db);

因此,您有机会真正关闭连接或重用它,而不会影响Dao代码。有了这两种方法,您就可以在不重新编码Dao对象的情况下切换管理连接的方式

我认为最好在Dao内部调用一种方法来从数据库中获取数据。如果你这样做,就说你的数据库被改变了。如果直接调用db查询获得数据,则必须编辑许多类。因此,如果您在DAO类内部分离db调用方法,并调用该方法以获取数据,则效果更好

我从这篇文章中得到了一个“不错”的解决方案

编辑,因为那个链接已经死了,这里有一个

主旨

我发现有趣的是使用了一个静态同步方法,它返回静态类及其变量的实例。大多数专业开发人员可能会发现这一点很明显。我发现这是一种管理db连接的有用模式

联营


Mongo执行自动连接池,因此关键是只使用到数据存储的一个连接,并让它处理自己的连接池。

因此,您建议每次执行操作时都获得一个新连接。我想知道是否有办法重用连接(这就是为什么我将Dao的方法/参数设置为静态的……尽管我可能只是想知道一些没有目的/不存在的东西。@Ankur:是的,例如获取一个新连接这将为连接增加更多的安全性,并帮助您在使用不同机器建立新连接的地方重新使用该方法。)或者服务器。只需更改参数,就可以获得连接。这是基本的。我觉得在MVC中处理连接的更好方法每次设置一个新连接都会导致性能不佳。我不太理解您编写的内容。但是,我同意,如果db参数(用户名,pwd等)更改。你把“publicstaticvoidsomemethod(stringsomedata)”放在哪里了?我认为如果你把所有的db调用方法都放在DAO类中是好的。不仅仅是建立连接的方法