使用zxJDBC与jython不工作
因为我想把最近在Minecraft的Python/Jython Bukkit插件中的数据存储方式从简单的文件转换成MySQL数据库,所以我开始在网上查资料。我试过用sqlite3和MySQLd来做Python的数据库连接,但都没有成功。经过几个小时在StackOverflow上搜索,我找到了一个问题和答案,这个答案应该能解决我的问题,因为它们是同样的事情。我试着按照这个答案中的步骤去做,但由于出现了这个错误,我没有成功:
[15:31:45 WARN]: org.bukkit.plugin.InvalidPluginException: Traceback (most recen
t call last):
File "<iostream>", line 10, in <module>
zxJDBC.DatabaseError: unable to instantiate datasource
[15:31:45 WARN]: at net.lahwran.bukkit.jython.PythonPluginLoader.loadPlug
in(PythonPluginLoader.java:296)
[15:31:45 WARN]: at net.lahwran.bukkit.jython.PythonPluginLoader.loadPlug
in(PythonPluginLoader.java:113)
[15:31:45 WARN]: at net.lahwran.bukkit.jython.PythonPluginLoader.loadPlug
in(PythonPluginLoader.java:83)
[15:31:45 WARN]: at org.bukkit.plugin.SimplePluginManager.loadPlugin(Simp
lePluginManager.java:305)
[15:31:45 WARN]: at com.master.bukkit.python.PythonLoader.onLoad(PythonLo
ader.java:113)
[15:31:45 WARN]: at org.bukkit.craftbukkit.v1_7_R1.CraftServer.loadPlugin
s(CraftServer.java:260)
[15:31:45 WARN]: at org.bukkit.craftbukkit.v1_7_R1.CraftServer.reload(Cra
ftServer.java:628)
[15:31:45 WARN]: at org.bukkit.Bukkit.reload(Bukkit.java:279)
[15:31:45 WARN]: at org.bukkit.command.defaults.ReloadCommand.execute(Rel
oadCommand.java:23)
[15:31:45 WARN]: at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCo
mmandMap.java:192)
[15:31:45 WARN]: at org.bukkit.craftbukkit.v1_7_R1.CraftServer.dispatchCo
mmand(CraftServer.java:542)
[15:31:45 WARN]: at org.bukkit.craftbukkit.v1_7_R1.CraftServer.dispatchSe
rverCommand(CraftServer.java:529)
[15:31:45 WARN]: at net.minecraft.server.v1_7_R1.DedicatedServer.aw(Dedic
atedServer.java:286)
[15:31:45 WARN]: at net.minecraft.server.v1_7_R1.DedicatedServer.u(Dedica
tedServer.java:251)
[15:31:45 WARN]: at net.minecraft.server.v1_7_R1.MinecraftServer.t(Minecr
aftServer.java:541)
[15:31:45 WARN]: at net.minecraft.server.v1_7_R1.MinecraftServer.run(Mine
craftServer.java:453)
[15:31:45 WARN]: at net.minecraft.server.v1_7_R1.ThreadServerApplication.
run(SourceFile:617)
我用的代码导致了上面的错误:
from com.ziclix.python.sql import zxJDBC
params = {}
params['serverName'] = 'host'
params['databaseName'] = 'dbname'
params['user'] = "username"
params['password'] = "pw"
params['port'] = 3306
db = apply(zxJDBC.connectx, ("org.gjt.mm.mysql.MysqlDataSource",), params)
我还试过这段代码:
from com.ziclix.python.sql import zxJDBC
d, u, p, v = "jdbc:mysql://host", "root", "pw", "org.gjt.mm.mysql.Driver"
db = zxJDBC.connect(d, u, p, v)
但它导致了这个错误:
[15:37:20 WARN]: Caused by: Traceback (most recent call last):
File "<iostream>", line 13, in <module>
zxJDBC.DatabaseError: driver [org.gjt.mm.mysql.Driver] not found
[15:37:20 WARN]: at org.python.core.PyException.doRaise(PyException.java:
200)
[15:37:20 WARN]: at org.python.core.Py.makeException(Py.java:1239)
[15:37:20 WARN]: at org.python.core.Py.makeException(Py.java:1243)
[15:37:20 WARN]: at com.ziclix.python.sql.zxJDBC.makeException(zxJDBC.jav
a:328)
[15:37:20 WARN]: at com.ziclix.python.sql.connect.Connect.__call__(Connec
t.java:78)
[15:37:20 WARN]: at org.python.core.PyObject.__call__(PyObject.java:441)
[15:37:20 WARN]: at org.python.core.PyObject.__call__(PyObject.java:447)
[15:37:20 WARN]: at org.python.pycode._pyx5.f$0(<iostream>:15)
[15:37:20 WARN]: at org.python.pycode._pyx5.call_function(<iostream>)
[15:37:20 WARN]: at org.python.core.PyTableCode.call(PyTableCode.java:165
)
[15:37:20 WARN]: at org.python.core.PyCode.call(PyCode.java:18)
[15:37:20 WARN]: at org.python.core.Py.runCode(Py.java:1275)
[15:37:20 WARN]: at org.python.util.PythonInterpreter.execfile(PythonInte
rpreter.java:235)
[15:37:20 WARN]: at org.python.util.PythonInterpreter.execfile(PythonInte
rpreter.java:230)
[15:37:20 WARN]: at net.lahwran.bukkit.jython.PythonPluginLoader.loadPlug
in(PythonPluginLoader.java:244)
[15:37:20 WARN]: ... 16 more
我实际做了什么(一步一步)?
我从这个链接下载了压缩的mysql connector/J(这是在之前提到的StackOverflow问题中给出的),解压后,从中复制了“mysql-connector-java-3.1.14-bin.jar”文件,然后把它粘贴到这个路径“C:\Users\my_name\Documents\1.7.2twistedjobs\plugins\MySQL_jython”。接着,我打开控制面板,点击系统,进入高级系统设置,点击环境变量按钮,新增一个名为CLASSPATH的变量(因为之前没有这个变量),并把这个路径设置为值“C:\Users\my_name\Documents\1.7.2twistedjobs\plugins\MySQL_jython\mysql-connector-java-3.1.14-bin.jar”,然后点击确定。
注意:因为zxJDBC没有导入错误,这很奇怪,因为它显然成功导入了,但却找不到驱动...
提前谢谢大家!
1 个回答
你的第二段代码应该是可以工作的,我这边测试也没问题。看起来你遇到的是CLASSPATH的问题。你可以尝试把你的MySQL驱动的jar文件放到扩展目录里,在Windows系统上,这个目录通常在这里:
%SystemRoot%\Sun\Java\lib\ext
这样的话,所有的Java应用程序都能使用这个驱动(如果你想这样的话)。具体的细节可以参考Oracle的文档:
http://docs.oracle.com/javase/tutorial/ext/basics/install.html
我还想提几点。首先,虽然你给的驱动名字可以用,但你可能最终会想把它从org.gjt.mm.mysql.Driver
改成com.mysql.jdbc.Driver
,这是一个现代化的、重新命名过的版本。(如果你想知道为什么,可以看这里的详细信息:https://stackoverflow.com/a/5808184/155167。)
你的第一段代码是不能工作的,因为在org.gjt.mm.mysql
包里没有MysqlDataSource
这个类。你提到的那个类其实在这里:com.mysql.jdbc.jdbc2.optional.MysqlDataSource
,但我不确定那个代码片段是否能正常工作。
就像我说的,把MySQL驱动的jar文件正确放到你的CLASSPATH里,应该就能正常工作。关于CLASSPATH设置的Oracle文档在这里:
http://docs.oracle.com/javase/tutorial/essential/environment/paths.html http://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html
祝你好运!