访问被拒绝,嵌入式 Derby 中的问题
Access is Denied, Issue in embedded Derby
我的 derby 引擎有问题。
当我创建新数据库、创建新的 table 并插入或显示行时,一切正常。当我尝试在我的练习示例中使用数据库时,数据库工作正常,我能够从 table.
插入和 select 数据
代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSetMetaData;
public class Restaurants
{
private static String dbURL = "jdbc:derby:c:\Apache\db-derby-10.14.2.0-bin\bin\myDBExample;create=true";
private static String tableName = "restaurants";
// jdbc Connection
private static Connection conn = null;
private static Statement stmt = null;
public static void main(String[] args)
{
createConnection();
//insertRestaurants(5, "LaVals Leb", "Berkeley");
//insertRestaurants(6, "House Leb", "New York");
selectRestaurants();
shutdown();
}
private static void createConnection()
{
try
{
Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
//Get a connection
conn = DriverManager.getConnection(dbURL);
}
catch (Exception except)
{
except.printStackTrace();
}
}
private static void insertRestaurants(int id, String restName, String cityName)
{
try
{
stmt = conn.createStatement();
stmt.execute("insert into " + tableName + " values (" +
id + ",'" + restName + "','" + cityName +"')");
stmt.close();
}
catch (SQLException sqlExcept)
{
sqlExcept.printStackTrace();
}
}
private static void selectRestaurants()
{
try
{
stmt = conn.createStatement();
ResultSet results = stmt.executeQuery("select * from " + tableName);
ResultSetMetaData rsmd = results.getMetaData();
int numberCols = rsmd.getColumnCount();
for (int i=1; i<=numberCols; i++)
{
//print Column Names
System.out.print(rsmd.getColumnLabel(i)+"\t\t");
}
System.out.println("\n-------------------------------------------------");
while(results.next())
{
int id = results.getInt(1);
String restName = results.getString(2);
String cityName = results.getString(3);
System.out.println(id + "\t\t" + restName + "\t\t" + cityName);
}
results.close();
stmt.close();
}
catch (SQLException sqlExcept)
{
sqlExcept.printStackTrace();
}
}
private static void shutdown()
{
try
{
if (stmt != null)
{
stmt.close();
}
if (conn != null)
{
DriverManager.getConnection(dbURL + ";shutdown=true");
conn.close();
}
}
catch (SQLException sqlExcept)
{
}
}
}
此代码工作正常,但是当我尝试使用 ij 再次创建到同一数据库的连接时,我在命令提示符中收到如下错误:
在图片中,上半部分是我第一次创建数据库时,但是之后在eclipse中使用它时,它给我这个错误。即使在eclipse中使用一次db也会导致这个错误。
问题是什么?为什么德比引擎没有获得授予它的访问权限?
感谢任何帮助。
发现问题。我必须使用以下命令在端口上将 derby 作为网络服务器启动:
startNetworkServer.bat
我怀疑您混淆了这里的数据库模式。在您的问题标题中,您提到了 "embedded Derby",但您的代码正在使用 ClientDriver 和 create=true 属性,如果不存在,它会创建数据库,但它不会启动服务器。
如果你不想启动服务器,你可以直接使用EmbeddedDriver。
您可能 运行 遇到问题的另一点是 shutdown=true 属性。您正在使用整个数据库 URL (dbURL) 包括文件名,但是如果您想从代码中关闭服务器,您应该省略文件名,如下所示:jdbc:德比:;关机=真。
您可以查看 Derby developer docs for information on using these attributes, and the Embedded Derby tutorial 在嵌入式模式下使用 Derby,这样您就不必担心启动服务器了。
我的 derby 引擎有问题。
当我创建新数据库、创建新的 table 并插入或显示行时,一切正常。当我尝试在我的练习示例中使用数据库时,数据库工作正常,我能够从 table.
插入和 select 数据代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSetMetaData;
public class Restaurants
{
private static String dbURL = "jdbc:derby:c:\Apache\db-derby-10.14.2.0-bin\bin\myDBExample;create=true";
private static String tableName = "restaurants";
// jdbc Connection
private static Connection conn = null;
private static Statement stmt = null;
public static void main(String[] args)
{
createConnection();
//insertRestaurants(5, "LaVals Leb", "Berkeley");
//insertRestaurants(6, "House Leb", "New York");
selectRestaurants();
shutdown();
}
private static void createConnection()
{
try
{
Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
//Get a connection
conn = DriverManager.getConnection(dbURL);
}
catch (Exception except)
{
except.printStackTrace();
}
}
private static void insertRestaurants(int id, String restName, String cityName)
{
try
{
stmt = conn.createStatement();
stmt.execute("insert into " + tableName + " values (" +
id + ",'" + restName + "','" + cityName +"')");
stmt.close();
}
catch (SQLException sqlExcept)
{
sqlExcept.printStackTrace();
}
}
private static void selectRestaurants()
{
try
{
stmt = conn.createStatement();
ResultSet results = stmt.executeQuery("select * from " + tableName);
ResultSetMetaData rsmd = results.getMetaData();
int numberCols = rsmd.getColumnCount();
for (int i=1; i<=numberCols; i++)
{
//print Column Names
System.out.print(rsmd.getColumnLabel(i)+"\t\t");
}
System.out.println("\n-------------------------------------------------");
while(results.next())
{
int id = results.getInt(1);
String restName = results.getString(2);
String cityName = results.getString(3);
System.out.println(id + "\t\t" + restName + "\t\t" + cityName);
}
results.close();
stmt.close();
}
catch (SQLException sqlExcept)
{
sqlExcept.printStackTrace();
}
}
private static void shutdown()
{
try
{
if (stmt != null)
{
stmt.close();
}
if (conn != null)
{
DriverManager.getConnection(dbURL + ";shutdown=true");
conn.close();
}
}
catch (SQLException sqlExcept)
{
}
}
}
此代码工作正常,但是当我尝试使用 ij 再次创建到同一数据库的连接时,我在命令提示符中收到如下错误:
在图片中,上半部分是我第一次创建数据库时,但是之后在eclipse中使用它时,它给我这个错误。即使在eclipse中使用一次db也会导致这个错误。
问题是什么?为什么德比引擎没有获得授予它的访问权限?
感谢任何帮助。
发现问题。我必须使用以下命令在端口上将 derby 作为网络服务器启动:
startNetworkServer.bat
我怀疑您混淆了这里的数据库模式。在您的问题标题中,您提到了 "embedded Derby",但您的代码正在使用 ClientDriver 和 create=true 属性,如果不存在,它会创建数据库,但它不会启动服务器。
如果你不想启动服务器,你可以直接使用EmbeddedDriver。
您可能 运行 遇到问题的另一点是 shutdown=true 属性。您正在使用整个数据库 URL (dbURL) 包括文件名,但是如果您想从代码中关闭服务器,您应该省略文件名,如下所示:jdbc:德比:;关机=真。
您可以查看 Derby developer docs for information on using these attributes, and the Embedded Derby tutorial 在嵌入式模式下使用 Derby,这样您就不必担心启动服务器了。