如何用java 5分钟实现一个最简单的mysql代理服务器?

什么是mysql 代理?

mysql代理是介于client端和mysql服务端中间层服务,如下图所示:

这里写图片描述

为什么要使用代理?

大部人都知道使用代理的好处,毕竟,随着互联网越来越普及,互联网系统越来越庞大、复杂,性能要求越来越高,为了让整个系统具有更好的扩展性、更高的性能、解藕等多种特性,在数据库层面引入代理层是目前互联网系统常见的架构设计方案。总的来说,在数据库层面引入代理会带来以下好处:

  • 将不同类型的请求分发的不同的server以此实现读写分离、负载均衡。
  • 来自不同客户端的请求分发到不同的server实现后端多租户数据库服务,当然,类似的原理还可以实现分库分表、一个请求写到多个server或者不同的源端如消息队列。
  • 监控统计客户端的请求情况,请求分布统计、请求类型等,以此来优化数据库的使用。
  • 总之,可以实现你想要的诸多功能。
如何用java快速实现一个最简单的代理呢?

首先,准备开发工具套件,我们并不会引入过多工具包,仅仅需要:

  • java8
  • vert.x 3

如果你是用maven做为项目管理工具,请将vert.x 3引入:

代码实现:

测试一下

不出意外,一切运行正常,恭喜你,你已经实现了一个最简单的mysql代理服务器。

写在最后

vert.x是基于jvm、事件驱动、异步IO、响应式编程工具套件,底层网络通信使用netty4,是一个非常优秀的java开发框架(当然,严格意义上讲是工具套件),使用vert.x可以快速构建的各种应用,并且天生分布式,集群管理。 另外,实现一个代理服务器远没有如此简单,根据需求的不同,复杂度也不同,这里仅仅是展示实现代理的核心代码,实现了最基本的代理功能,当然了,一切复杂的需求都可以基于上面的代码进行改造扩展.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
确实可以使用JavaMySQL实现一个简单的学生管理系统,并且可以通过页面进行操作。这里给出一个简单的示例,该示例使用Java Servlet和JSP技术来实现网页界面,并使用MySQL存储数据。以下是实现步骤: 1. 创建一个名为`Student`的Java类,该类表示学生对象,包括学生ID、姓名和年龄等属性,以及对这些属性的读写方法。 ```java public class Student { private int id; private String name; private int age; public Student() { } public Student(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } ``` 2. 创建一个名为`StudentDAO`的Java类,该类表示数据访问对象,负责管理学生对象的持久化存储。该类包括以下方法: - `getConnection()`:获取数据库连接。 - `closeConnection(Connection conn)`:关闭数据库连接。 - `add(Student student)`:添加一个学生对象到数据库中。 - `delete(int id)`:从数据库中删除一个学生对象。 - `update(Student student)`:更新一个学生对象在数据库中的信息。 - `get(int id)`:从数据库中查找一个学生对象。 - `getAll()`:从数据库中获取所有的学生对象列表。 ```java import java.sql.*; import java.util.ArrayList; import java.util.List; public class StudentDAO { private static final String DRIVER = "com.mysql.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/test"; private static final String USERNAME = "root"; private static final String PASSWORD = "password"; public Connection getConnection() throws SQLException { Connection conn = null; try { Class.forName(DRIVER); conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); } catch (ClassNotFoundException e) { e.printStackTrace(); } return conn; } public void closeConnection(Connection conn) throws SQLException { if (conn != null) { conn.close(); } } public void add(Student student) throws SQLException { Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement("INSERT INTO student(name, age) VALUES(?, ?)"); ps.setString(1, student.getName()); ps.setInt(2, student.getAge()); ps.executeUpdate(); ps.close(); closeConnection(conn); } public void delete(int id) throws SQLException { Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement("DELETE FROM student WHERE id=?"); ps.setInt(1, id); ps.executeUpdate(); ps.close(); closeConnection(conn); } public void update(Student student) throws SQLException { Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement("UPDATE student SET name=?, age=? WHERE id=?"); ps.setString(1, student.getName()); ps.setInt(2, student.getAge()); ps.setInt(3, student.getId()); ps.executeUpdate(); ps.close(); closeConnection(conn); } public Student get(int id) throws SQLException { Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement("SELECT * FROM student WHERE id=?"); ps.setInt(1, id); ResultSet rs = ps.executeQuery(); Student student = null; if (rs.next()) { student = new Student(); student.setId(rs.getInt("id")); student.setName(rs.getString("name")); student.setAge(rs.getInt("age")); } rs.close(); ps.close(); closeConnection(conn); return student; } public List<Student> getAll() throws SQLException { Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement("SELECT * FROM student"); ResultSet rs = ps.executeQuery(); List<Student> students = new ArrayList<>(); while (rs.next()) { Student student = new Student(); student.setId(rs.getInt("id")); student.setName(rs.getString("name")); student.setAge(rs.getInt("age")); students.add(student); } rs.close(); ps.close(); closeConnection(conn); return students; } } ``` 3. 创建一个名为`StudentServlet`的Java Servlet类,该类处理网页请求。该类包括以下方法: - `doGet(HttpServletRequest request, HttpServletResponse response)`:处理GET请求,显示学生列表或单个学生信息。 - `doPost(HttpServletRequest request, HttpServletResponse response)`:处理POST请求,添加、修改或删除学生信息。 ```java import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.sql.SQLException; import java.util.List; public class StudentServlet extends HttpServlet { private StudentDAO studentDAO = new StudentDAO(); @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); if (action == null) { List<Student> students = null; try { students = studentDAO.getAll(); } catch (SQLException e) { e.printStackTrace(); } request.setAttribute("students", students); request.getRequestDispatcher("/WEB-INF/views/student/list.jsp").forward(request, response); } else if (action.equals("add")) { request.getRequestDispatcher("/WEB-INF/views/student/add.jsp").forward(request, response); } else if (action.equals("edit")) { int id = Integer.parseInt(request.getParameter("id")); Student student = null; try { student = studentDAO.get(id); } catch (SQLException e) { e.printStackTrace(); } request.setAttribute("student", student); request.getRequestDispatcher("/WEB-INF/views/student/edit.jsp").forward(request, response); } else if (action.equals("delete")) { int id = Integer.parseInt(request.getParameter("id")); try { studentDAO.delete(id); } catch (SQLException e) { e.printStackTrace(); } response.sendRedirect(request.getContextPath() + "/student"); } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); if (action.equals("add")) { String name = request.getParameter("name"); int age = Integer.parseInt(request.getParameter("age")); Student student = new Student(); student.setName(name); student.setAge(age); try { studentDAO.add(student); } catch (SQLException e) { e.printStackTrace(); } response.sendRedirect(request.getContextPath() + "/student"); } else if (action.equals("edit")) { int id = Integer.parseInt(request.getParameter("id")); String name = request.getParameter("name"); int age = Integer.parseInt(request.getParameter("age")); Student student = new Student(); student.setId(id); student.setName(name); student.setAge(age); try { studentDAO.update(student); } catch (SQLException e) { e.printStackTrace(); } response.sendRedirect(request.getContextPath() + "/student"); } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } } } ``` 4. 创建一个名为`list.jsp`的JSP文件,该文件显示学生列表和操作链接。 ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>学生列表</title> </head> <body> <h1>学生列表</h1> <table border="1"> <tr> <th>ID</th> <th>姓名</th> <th>年龄</th> <th>操作</th> </tr> <c:forEach var="student" items="${students}"> <tr> <td>${student.id}</td> <td>${student.name}</td> <td>${student.age}</td> <td> <a href="${pageContext.request.contextPath}/student?action=edit&id=${student.id}">编辑</a> <a href="${pageContext.request.contextPath}/student?action=delete&id=${student.id}">删除</a> </td> </tr> </c:forEach> </table> <br> <a href="${pageContext.request.contextPath}/student?action=add">添加学生</a> </body> </html> ``` 5. 创建一个名为`add.jsp`的JSP文件,该文件显示添加学生的表单。 ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>添加学生</title> </head> <body> <h1>添加学生</h1> <form action="${pageContext.request.contextPath}/student" method="post"> <input type="hidden" name="action" value="add"> <table> <tr> <td>姓名:</td> <td><input type="text" name="name"></td> </tr> <tr> <td>年龄:</td> <td><input type="text" name="age"></td> </tr> <tr> <td></td> <td><input type="submit" value="添加"></td> </tr> </table> </form> </body> </html> ``` 6. 创建一个名为`edit.jsp`的JSP文件,该文件显示编辑学生的表单。 ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>编辑学生</title> </head> <body> <h1>编辑学生</h1> <form action="${pageContext.request.contextPath}/student" method="post"> <input type="hidden" name="action" value="edit"> <input type="hidden" name="id" value="${student.id}"> <table> <tr> <td>姓名:</td> <td><input type="text" name="name" value="${student.name}"></td> </tr> <tr> <td>年龄:</td> <td><input type="text" name="age" value="${student.age}"></td> </tr> <tr> <td></td> <td><input type="submit" value="保存"></td> </tr> </table> </form> </body> </html> ``` 7. 创建一个名为`web.xml`的Web应用程序部署描述文件,该文件指定Servlet和JSP文件的映射关系。 ```xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>StudentServlet</servlet-name> <servlet-class>StudentServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>StudentServlet</servlet-name> <url-pattern>/student</url-pattern> </servlet-mapping> </web-app> ``` 8. 将以上代码保存到对应的文件中,并将JSP文件放置到`/WEB-INF/views/student/`目录下。然后在本地MySQL数据库中创建一个名为`test`的数据库,运行以下SQL语句以创建学生表: ```sql CREATE TABLE `student` ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(20) NOT NULL, `age` INT NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` 9. 最后,启动Tomcat服务器,访问`http://localhost:8080/项目名称/student`即可进入学生列表页面。从该页面可以添加、编辑和删除学生信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值