【问题标题】:REST Web Service to consume MySQL DB使用 MySQL 数据库的 REST Web 服务
【发布时间】:2011-12-07 04:59:01
【问题描述】:

我正在使用 JAX-RS 和 Tomcat 构建一个 REST WebService 来使用 MySQL 数据库。

我正在关注这个模型:

@Path("/login")  
public class Login {

String username;
String password;
// This method is called if POST is requested
@POST
@Produces(MediaType.APPLICATION_XML)
public String loginResponseXML(@FormParam("username") String user, @FormParam("password") String pass) {

    //Connection to MySQL Database
    try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost/sakila", "root","larcom");
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("Select first_name, last_name From actor where first_name='" +
                                        user + "' and last_name='" + pass + "'");

        while (rs.next()){
            System.out.println(rs.getString("first_name") + " " + rs.getString("last_name"));
            username = rs.getString("first_name");
            password = rs.getString("last_name");
        }
    }           
    catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }

    if (user.equals(username) && pass.equals(password)) {
        return ("<?xml version=\"1.0\"?>" + "<auth>200" + "</auth>"); //Success
        //return "Success!";
    } else {
        return ("<?xml version=\"1.0\"?>" + "<auth>404" + "</auth>"); //Damn
        //return "Damn!";
    }

    }
}

我调用这个方法:

HttpPost httppost = new HttpPost("http://192.168.15.245:8080/org.jersey.andre/rest/login");

现在,我的问题是: 如果我想在数据库中查询另一个表,我必须创建一个像 Login 这样的新类并再次建立 JDBC 连接? 对数据库进行查询的每个类都有一个新类和一个新的 JDBC 连接?性能问题?

希望你能理解。 提前致谢。

【问题讨论】:

  • 所以你想要一个类,一个连接到一个数据库的所有表,所有的 Restful 资源?性能问题? ;)

标签: mysql web-services rest


【解决方案1】:

这里有一些提示:请将基于数据库的代码隔离到“数据层”,可以这么说……仅在资源类中执行调度/业务逻辑。

现在,如果您要查询不同的表,您将有不同的查询!您可以使用相同的连接(错误)或创建一个新连接并触发不同的查询。

现在,每个资源是访问不同的表还是使用不同的查询访问同一个表取决于您为该资源选择的“表示”。 RDB 模式有多个表是有原因的,并且很常见的是,您将有一个涉及多个表或相互独立的表的不同查询。

性能问题:可以这么说,对于“新鲜数据”,您总是要访问数据库。如果您想优化,要么开发自己的缓存(非常困难),要么使用 memcached 或 ehcache 之类的方法来提高性能 - 在您决定这样做之前,请确保您验证它是否值得。

您是否将每秒获得大约 1000 次 DB 命中?您可能需要一些性能提升/处理。每天……也许不是。每 2-3 天...YAGNI(你不会需要它,所以暂时不用担心)

因此,对于您在应用程序中设计的每个“资源”(登录不是资源:请参阅相关帖子:Why is form based authentication NOT considered RESTful?)选择表示。它可能涉及不同的查询等,以便您返回 json/xml/xhtml(无论您选择什么)。每个“与数据库相关的调用”都应该被隔离到它自己的“数据层”中——我建议使用 Spring JDBC 来让你的生活更轻松。它将减轻 JDBC 的负担,因此您可以专注于创建 DAO(数据访问对象 - 数据访问类的一种模式。所有 DAO 在逻辑上都属于数据层)

希望对你有帮助

【讨论】:

  • 感谢您的回答。我想我明白了,但我对你的回答有几个问题。我同意性能问题。这不是问题。 “将数据库代码隔离到数据层”是什么意思?现在,如果我想创建一个新资源:我将构建一个类似于 Login 的类并定义 /person 的路径,例如,创建一个新的 jdbc 连接和一个新的查询。这是正确的吗?
  • 代码组织:数据库访问代码应该在专门用于该目的的类中。您正在混合资源+业务逻辑并在其中嵌入数据访问代码......这将使您的代码不那么模块化 - 每个类应该只有一个责任。数据访问类只查询和检索数据。资源类对该数据进行处理并将其发送回等,
猜你喜欢
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 2014-08-18
  • 2017-08-13
相关资源
最近更新 更多