如何在 Java 中同时设置客户端-服务器程序和数据库?

Posted

技术标签:

【中文标题】如何在 Java 中同时设置客户端-服务器程序和数据库?【英文标题】:How to set-up a client-server program and a database together in Java? 【发布时间】:2022-01-09 15:50:45 【问题描述】:

我需要创建一个包含客户端、服务器和数据库的程序 客户端需要将数据输入数据库或通过服务器查询,我正在使用 mysql 和 JDBC 将 MySQL 连接到我的 java 代码。我想知道理想的设置是什么。

例如,我使用以下代码连接到我的数据库:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class test2 

    public static void main(String[] args) 
        
        String url = "jdbc:mysql://localhost:3306/CovidPreventation";
        String username = "test";
        String password = "test";

        System.out.println("Connecting database...");

        try (Connection connection = DriverManager.getConnection(url, username, password)) 
            System.out.println("Database connected!");
         catch (SQLException e) 
            throw new IllegalStateException("Cannot connect the database!", e);
        
    
    


我想知道这应该放在哪里,我应该将它放在服务器类还是连接到服务器的单独类中。这是我第一次做这样的事情,我希望我的做法很好,所以非常感谢帮助。

【问题讨论】:

Separation of Concerns。当然,您不会在服务器的主类中初始化数据库连接,而是在单独的类中初始化。而且您不会在类内部而是在外部配置文件(例如 config.properties)中硬连线连接详细信息,如数据库 URL、用户和密码。因此无需重新编译即可配置系统。 @vanje 如果连接代码在单独的类中,我将如何使服务器与数据库通信? 【参考方案1】:

DataSource

SQL 包定义了DataSource 接口。这种类型的对象是您保存数据库连接信息的地方,例如数据库服务器地址、数据库用户名、密码等。

引用文档:

连接到此DataSource 对象所代表的物理数据源的工厂。作为DriverManager 工具的替代方案,DataSource 对象是获得连接的首选方法。

选择该接口的实现。 JDBC 驱动程序通常带有一个或多个特定于该特定数据库的实现。您需要特定于该数据库的实现,因为各种数据库具有不同的功能和设置。

返回一个更通用类型的对象,接口,而不是更具体的类型,具体实现。这样做可以让您灵活地将具体类换成另一个类,而不会破坏任何调用代码。

    private DataSource configureDataSource ( )
    
        System.out.println( "INFO - `configureDataSource` method. " + Instant.now() );

        com.mysql.cj.jdbc.MysqlDataSource dataSource = Objects.requireNonNull( new com.mysql.cj.jdbc.MysqlDataSource() );  // Implementation of `DataSource`.
        dataSource.setServerName( "db-mysql-lon3-433-do-user-89673-1.x.db.ondigitalocean.com" );
        dataSource.setPortNumber( 24_090 );
        dataSource.setDatabaseName( "defaultdb" );
        dataSource.setUser( "scott" );
        dataSource.setPassword( "tiger" );
        return dataSource;
    

在您的应用中保留 DataSource 对象。需要数据库连接时,拨打DataSource#getConnection

        String sql = "SELECT name_ from  user_ ; " ;
        try (
                Connection conn = myDataSource.getConnection() ;
                Statement statement = conn.createStatement() ;
                ResultSet resultSet = statement.executeQuery( sql ) ;
        )
        
            while ( resultSet.next() )
            
                String userName = resultSet.getString( "name_" );
                System.out.println( username ) ;
            
        
        catch ( SQLException e )
        
            e.printStackTrace();
        

请务必关闭您的开放资源,例如 ConnectionStatementPreparedStatementResultSet。一般最好使用try-with-resources语法自动关闭你的资源。

请注意,DataSource 永远不会“打开”,因此我们永远不需要关闭它。 DataSource 仅包含向数据库服务器请求连接所需的信息位。 DataSource 对象本身不是资源。

JNDI

最终你可能想要使用JNDI 来获得DataSource 对象。这使您可以通过Jakarta EE 服务器、LDAP 服务器等将数据库配置外部化,而不是硬编码用户名、密码等。

在这种方法下,当您的数据库更改其地址或密码时,您可以更新外部配置,而无需重新编译您的代码并重新部署您的应用程序。

引用文档:

实现DataSource 接口的对象通常会注册到基于 Java 命名和目录 (JNDI) API 的命名服务。

更多信息

另见:

Implementation of JDBC DataSource in MySQL Connector/J 8 Tutorial 由 Oracle 提供,免费 Why do we use a DataSource instead of a DriverManager?

【讨论】:

【参考方案2】:

我猜您是在询问应用程序的设计/架构。如果是这种情况,那么您应该遵循 MVC 架构模式。

** 什么是 MVC?**

MVC 包含三个主要组件:

型号 查看 控制器

他们每个人都有特定的职责。

型号 模型负责或维护数据。它实际上连接到数据库。所以任何数据操作,即你想要做的添加/更新/删除/插入都是在模型中完成的。基本上模型只与控制器对话并将所需的数据提供给控制器。即模型从不直接与数据通信。

查看 数据表示,即 UI(html/CSS 部分)由 View 完成。控制器向视图提供数据,这些数据将显示给最终用户。即 View 只与控制器对话。

控制器 控制器支持视图和模型之间的交互。它不必担心业务逻辑。它会告诉模型应该做什么。从 Model 接收数据后,它会将其发送到 View。

【讨论】:

【参考方案3】:

你需要一个 jdbc 驱动程序,你可以在这里得到它:https://mvnrepository.com/artifact/mysql/mysql-connector-java

并将 jar 文件添加到您的 ide

在你需要像这样在你的代码中调用它之后:

public static Connection getConnection(String dbURL, String userName, 
            String password) 
        Connection conn = null;
        try 
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(dbURL, userName, password);
            System.out.println("connect successfully!");
         catch (Exception ex) 
            System.out.println("connect failure!");
            ex.printStackTrace();
        
        return conn;
    

【讨论】:

Class.forName 很多年都不需要了。在现代 Java 中,JDBC 驱动程序通过 Java 中的 服务提供者接口 (SPI) 工具自动注册到 JVM。 @BasilBourque 在我的学校里他们教这个,顺便谢谢你的信息

以上是关于如何在 Java 中同时设置客户端-服务器程序和数据库?的主要内容,如果未能解决你的问题,请参考以下文章

1. 项目介绍

如何与服务器同时处理多个请求

C#中三个kinect 2设置之间的通信

java中怎么设置一个session在整个web中的时间

在多租户应用程序中动态设置 Flask-SQLAlchemy 数据库连接

java线程day-02