【澄清】本文章仅用作备忘,文中提及的解决方案与相关操作均来自http://www.cnblogs.com/hoobey/p/5994393.html,并非本人原创。
第一节 系统环境概述
SQL Server Express 2017
SQL Server Management Studio 17.9.1
Oracel Java Development Kit 11.0.2
Eclipse IDE for JavaEE 4.10 (2019-03)
Apache Tomcat 9.0.16
JDBC for SQL Server 7.2 JRE11
第二节 问题描述与重现
在完成JSP课程设计(利用JDBC开发Web数据库程序)过程中,出现JDBC无法连接登陆SQL Server数据库的情况,程序源代码如下:
// DatabaseConnect.java
package task1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 这是一个通过Microsoft JDBC for SQL Server连接数据库的封装类
*
* @author Legend_1949
* @date 2019/04/17
*/
public class DatabaseConnect {
/**
* 数据库链接
*/
private String connectURL = null;
/**
* 数据库连接对象
*/
private Connection connection = null;
/**
* 结果集对象
*/
private ResultSet resultSet = null;
/**
* 构造函数,预置连接配置文件
*/
public DatabaseConnect() {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
connectURL = "jdbc:sqlserver://localhost:1433;";
connectURL += "database=Market;";
connectURL += "user=sa;";
connectURL += "password=Furious5;";
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 执行精确查询
*
* @param _SQL
* 需要执行的SQL语句
* @return 查询结果集
*/
public ResultSet executeSelect(String _SQL) {
try {
// 登陆数据库
connection = DriverManager.getConnection(connectURL);
Statement statement = connection.createStatement();
resultSet = statement.executeQuery(_SQL);
} catch (SQLException e) {
e.printStackTrace();
}
return resultSet;
}
/**
* 执行模糊查询
*
* @param _SQL
* 需要执行的SQL语句
* @return 查询结果集
*/
public ResultSet executeInsensitiveSelect(String _SQL) {
try {
connection = DriverManager.getConnection(connectURL);
Statement statement =
connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
resultSet = statement.executeQuery(_SQL);
} catch (SQLException e) {
e.printStackTrace();
}
return resultSet;
}
/**
* 执行数据更新
*
* @param _SQL
* 需要执行的SQL语句
* @return 数据更新影响的行数
*/
public int executeModify(String _SQL) {
int result = 0;
try {
connection = DriverManager.getConnection(connectURL);
System.out.println("Database Connected!");
Statement statement = connection.createStatement();
result = statement.executeUpdate(_SQL);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
}
<!-- insert.jsp -->
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta charset="UTF-8" />
<title>输入数据</title>
<style type="text/css">
* {
margin: auto;
padding: auto;
text-align: center;
}
input {
text-align: left;
}
</style>
</head>
<body>
<div>
<form action="insertSolver.jsp">
<table>
<tbody>
<tr>
<td style="font-size: 36; font-weight: bold; margin: 10px auto;"
colspan="2">数据输入</td>
</tr>
<tr>
<td>产品名称:</td>
<td><input type="text" name="Name" /></td>
</tr>
<tr>
<td>产品型号:</td>
<td><input type="text" name="Series" /></td>
</tr>
<tr>
<td>品牌:</td>
<td><input type="text" name="TradeMark" /></td>
</tr>
<tr>
<td>产地:</td>
<td><input type="text" name="MadeIn" /></td>
</tr>
<tr>
<td>价格:</td>
<td><input type="number" name="Price" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="插入" /> <input
type="reset" value="清空" /></td>
</tr>
</tbody>
</table>
</form>
</div>
</body>
</html>
<!-- insertSolver.jsp -->
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<jsp:useBean id="connector" scope="page" class="task1.DatabaseConnect"></jsp:useBean>
<html>
<head>
<meta charset="UTF-8" />
<title>数据插入中,请稍候……</title>
<%
// 设置参数编码格式
request.setCharacterEncoding("UTF-8");
// 用户输入的数据集
String[] parameters = new String[5];
parameters[0] = request.getParameter("Name");
parameters[1] = request.getParameter("Series");
parameters[2] = request.getParameter("TradeMark");
parameters[3] = request.getParameter("MadeIn");
parameters[4] = request.getParameter("Price");
// 分段形成插入语句
String sqlString = "INSERT INTO [dbo].[Goods] ([Name], [Series], [TradeMark], [MadeIn], [Price]) VALUES (";
for (int i = 0; i < parameters.length - 1; i++) {
sqlString += ("'" + parameters[i] + "', ");
}
// Price字段的类型与前面不同,需要单独出来
sqlString += (parameters[4] + ")");
System.out.println(sqlString);
System.out.println("Trying to connect ...");
// 受到影响的行数
int effect = connector.executeModify(sqlString);
// 当受到影响的行数不为0
if (effect != 0) {
out.println("<script type='text/javascript'>");
out.println("alert('添加成功!');");
out.println("window.location.href='#';");
out.println("</script>");
} else {
out.println("<script type='text/javascript'>");
out.println("alert('错误:添加失败!');");
out.println("window.location.href='insert.jsp';");
out.println("</script>");
}
%>
</head>
<body>
</body>
</html>
启动Tomcat服务器并在浏览器运行jsp页面:
输入数据并提交,会出现以下问题:
第三节 问题溯源及解决方案
以上问题是由于数据库连接被阻止的缘故,所以通过修改JVM“政策”允许JVM与SQL Server建立连接。
定位至以下路径并打开文件:
$JAVA_HOME\conf\security\java.policy
在我的设备上则是这个:
D:\Program_Files_(x64)\Java\JDK_11.0.2\conf\security\java.policy
在其中添加第46~50行内容并保存(也可以直接将第49行内容放在第17~43行中间):
//
// This system policy file grants a set of default permissions to all domains
// and can be configured to grant additional permissions to modules and other
// code sources. The code source URL scheme for modules linked into a
// run-time image is "jrt".
//
// For example, to grant permission to read the "foo" property to the module
// "com.greetings", the grant entry is:
//
// grant codeBase "jrt:/com.greetings" {
// permission java.util.PropertyPermission "foo", "read";
// };
//
// default permissions granted to all domains
grant {
// allows anyone to listen on dynamic ports
permission java.net.SocketPermission "localhost:0", "listen";
// "standard" properies that can be read by anyone
permission java.util.PropertyPermission "java.version", "read";
permission java.util.PropertyPermission "java.vendor", "read";
permission java.util.PropertyPermission "java.vendor.url", "read";
permission java.util.PropertyPermission "java.class.version", "read";
permission java.util.PropertyPermission "os.name", "read";
permission java.util.PropertyPermission "os.version", "read";
permission java.util.PropertyPermission "os.arch", "read";
permission java.util.PropertyPermission "file.separator", "read";
permission java.util.PropertyPermission "path.separator", "read";
permission java.util.PropertyPermission "line.separator", "read";
permission java.util.PropertyPermission
"java.specification.version", "read";
permission java.util.PropertyPermission "java.specification.vendor", "read";
permission java.util.PropertyPermission "java.specification.name", "read";
permission java.util.PropertyPermission
"java.vm.specification.version", "read";
permission java.util.PropertyPermission
"java.vm.specification.vendor", "read";
permission java.util.PropertyPermission
"java.vm.specification.name", "read";
permission java.util.PropertyPermission "java.vm.version", "read";
permission java.util.PropertyPermission "java.vm.vendor", "read";
permission java.util.PropertyPermission "java.vm.name", "read";
};
// The following grant permissions are defined by Administrators.
grant {
// Allows everyone to connect SQL Server Database by using JDBC for SQL Server
permission java.net.SocketPermission "localhost:1433", "connect,resolve";
};
在Eclipse中重新启动Apache Tomcat服务器,即可正常连接至数据库。