我正在尝试在我的OSX笔记本电脑上启动并运行开发环境,在Eclipse中创建JSP,使用Tomcat服务器运行以及连接到Oracle数据库。
Eclipse和Tomcat一起玩得很好,我可以制作JSP等等。现在最困难的部分是在Mountain Lion上启动并运行Oracle数据库,并让Eclipse连接到它。
在广泛的谷歌搜索之后,我找到了许多资源:
http://dimitrisli.wordpress.com/2012/08/08/how-to-install-oracle-database-on-mac-os-any-version/ http://barrymcgillin.blogspot.com/2011/12/using-oracle-developer-days-virtualbox.html
(甚至https://docs.google.com/document/d/1Th5MSIhS13YIJYCD8W1GLnOQEfrfov-92-He1cluTec/pub)
按照这些(相当全面的)指南,我从Oracle下载了最新的虚拟机,在这里: http://www.oracle.com/technetwork/database/enterprise-edition/databaseappdev-vm-161299.html
注意:上述所有三个教程都使用较旧版本的VM,它具有Oracle DB 10或11,但现在可用的是12c。新版本也有不同版本的Oracle Linux,可能还有其他一些差异。各种用户名和密码似乎略有不同。
我安装了VirtualBox,加载到VM中,将其联机。我的网络设置只配置了一个NAT适配器,适配器类型为“PCnet-FAST III”,端口转发从127.0.0.1到10.0.4.15,端口1521到1521和2222到22。
现在,如果我在主机上打开终端,我可以通过ssh -p 2222 oracle@localhost
SSH进入我的VM。我在虚拟机中获得了终端,它给了我在VirtualBox中首次启动虚拟机时获得的欢迎消息。此外,我可以ping localhost或127.0.0.1,它会以变量但短暂的延迟响应。
基于此,我只能假设我的虚拟机正在运行,并且我的端口转发(在我链接到的所有3个教程中都已布置)处于良好状态。
现在,我希望将Eclipse连接到VM中的Oracle数据库。如果您查看第一个教程,dimitrisli将使用指向VM的数据源设置IntelliJ。我想在Eclipse中做同样的事情。
我是Eclipse的新手,所以我四处寻找如何做到这一点,我想出了:
1)制作新的数据库驱动程序。
我从Oracle下载了JDBC for Oracle Database 12c,JDK 7,here。我把.jar文件粘贴在我的Documents文件夹中(如果这是错误的)。在Eclipse中,我根据其他Oracle驱动程序模板创建了一个新的数据库驱动程序,并更改了设置。在“驱动程序文件”下,我指向我的ojdbc7.jar
文件,在“属性”下,我有以下内容 - 如果这是错误,请告诉我:
Catalog: USER
Connection URL: jdbc:oracle:thin:@localhost:1521:orcl
Database Name: pdb1
Driver Class: oracle.jdbc.OracleDriver
Password:
User ID:
我尝试使用Oracle驱动程序模板中的内容,只是调整以匹配我的确切场景(基于演练中所说的内容以及我可以在现代版本的虚拟机中找到的内容)。
2)建立新的数据库连接。
当我去创建一个新的数据库连接时,我转到驱动程序属性区域,我可以选择我的自定义驱动程序。还有一个属性字段,我将其输入以下内容:(其中一些似乎覆盖或复制了我在创建驱动程序时输入的内容?)
SID: orcl
Host: 127.0.0.1
Port Number: 1521
User Name: hr // Gotten from one of the tutorials. Have also tried 'system/oracle', neither works yet.
Password: oracle
Connection URL: jdbc:oracle:thin:@127.0.0.1:1521:orcl // Immutable, set by the Driver I suppose.
Catalog: User
当我点击“测试连接”时,它会挂起一段时间,然后我收到“Ping失败!”错误,详细信息:
java.sql.SQLRecoverableException: IO Error: Socket read timed out
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:673)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:715)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:564)
at org.eclipse.datatools.connectivity.drivers.jdbc.JDBCConnection.createConnection(JDBCConnection.java:298)
at org.eclipse.datatools.connectivity.DriverConnectionBase.internalCreateConnection(DriverConnectionBase.java:105)
at org.eclipse.datatools.connectivity.DriverConnectionBase.open(DriverConnectionBase.java:54)
at org.eclipse.datatools.connectivity.drivers.jdbc.JDBCConnection.open(JDBCConnection.java:81)
at org.eclipse.datatools.enablement.internal.oracle.JDBCOracleConnectionFactory.createConnection(JDBCOracleConnectionFactory.java:27)
at org.eclipse.datatools.connectivity.internal.ConnectionFactoryProvider.createConnection(ConnectionFactoryProvider.java:83)
at org.eclipse.datatools.connectivity.internal.ConnectionProfile.createConnection(ConnectionProfile.java:359)
at org.eclipse.datatools.connectivity.ui.PingJob.createTestConnection(PingJob.java:76)
at org.eclipse.datatools.connectivity.ui.PingJob.run(PingJob.java:59)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)
Caused by: oracle.net.ns.NetException: Socket read timed out
at oracle.net.ns.Packet.receive(Packet.java:350)
at oracle.net.ns.NSProtocolStream.negotiateConnection(NSProtocolStream.java:153)
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:263)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1360)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486)
... 14 more
不幸的是,作为Java和Eclipse以及Oracle DB的新手,我不太清楚如何处理这个问题,而且我一直在试图确定可能出错的几个小时。我希望有这方面经验的人可以指出我正确的方向。
(哦,我不是一个没有经验的开发人员 - 只是这些工具的新手。)
谢谢!
答案 0 :(得分:7)
在浪费了大约6到7个小时之后,我解决了我的问题。
感谢这篇文章: Virtualbox "port forward" from Guest to Host
特别是来自@Nicholas的评论让我意识到我已经停用了Mac的防火墙,而不是客户操作系统中的防火墙。把它关掉会让一切都突然发挥作用。
我认为客户操作系统防火墙的默认配置确实允许端口2222上的SSH,因为即使防火墙就位也能正常工作,这会误导我认为我的数据库驱动程序有问题或者连接。
希望这会使后代受益。
编辑:
正如@HarpreetDawar所提到的,访问数据库的正确连接字符串是:
jdbc:oracle:thin:@localhost:1521/PDB1
我使用的那个以:orcl
而不是/PDB1
结尾,连接到“容器数据库”。我不完全了解Oracle 12c和“可插拔数据库”实现,但粗略的想法是,您可以在一个数据库中拥有多个数据库,并且可以通过插入/拔出它们来打开和关闭它们。因此,“PDB1”,可插拔数据库1。
如果你连接到Container,你会发现你无法创建一个新的User / Schema而不用“C ##”作为前缀,这有点尴尬。那是因为Container不打算用作普通的DB。您连接到Container以插入/拔出可插拔dbs(毫无疑问,其他东西)。
因此,如果要连接到Container,请在连接字符串中使用冒号和“SID”(VM中的orcl),如果要连接到Pluggable,请使用正斜杠和“服务”在连接字符串中命名“(VM中的PDB1)。
无论如何,这是我在解决原始问题后学到的其他数据。
还有一件事!关于端口转发的说明。
假设您现在已经启动并运行了虚拟机,并且可以正常连接到Oracle数据库等等。但是您有一位想要随身携带数据库的朋友?嗯,这很容易。他应该使用相同的连接字符串,使用您的IP地址而不是localhost,并且您在VirtualBox中设置的端口转发应该将他的连接(使用端口1521)直接发送到您的VM。正确?
好吧,如果您将端口转发设置为From: 127.0.0.1
,它将无效,因为您的好友的连接将转到您的外部IP地址。因此,请从外部IP地址向VM添加其他端口转发设置。然后它会很棒!
-Matt
答案 1 :(得分:2)
我是第一个指南的作者 Matt Mc 引用并冒昧地将我的评论作为单独的答案发布给他的答案,以便于查看。
我最初编写this guide〜2年前详细解释了使用VirtualBox在Mac上安装Oracle 11gR2 的过程。
昨天(4月25日14日),我已升级the same guide,概述了使用VirtualBox在Mac上安装Oracle 12cR1 所需的所有额外步骤。
答案 2 :(得分:0)
使用以下网址
url = jdbc:oracle:thin:@ // 127.0.01:1521 / PDB1
让它发挥作用。