<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
    <channel>
        <title>CUBRID - Open Source Database Management System Optimized for Web</title>
        <link>http://wiki.cubrid.org/</link>
        <description></description>
        <language>en</language>
        <pubDate>Wed, 22 Feb 2012 14:20:49 -0800</pubDate>
        <lastBuildDate>Wed, 22 Feb 2012 14:21:11 -0800</lastBuildDate>
        <generator>XpressEngine 1.4.4.1</generator>
                        										        <item>
            <title>Session level locking table locking</title>
            <dc:creator>Cristian Romanescu</dc:creator>
            <link>http://www.cubrid.org/questions/300897</link>
            <guid isPermaLink="true">http://www.cubrid.org/questions/300897</guid>
                                    <description><![CDATA[<p>Greetings,</p><p><br /></p><p>Is there any support to lock a table using SQL statement?&nbsp;For instance, I would like to lock a table for writing from PHP to prevent other connections to write.&nbsp;I've read the manual here&nbsp;<a href="/transaction_and_lock">http://www.cubrid.org/transaction_and_lock</a>&nbsp;and seem the lock is global at the transaction level, is this correct?</p><p>If I am not in the context of a transaction, I cannot lock a table. Is this correct?</p><p><br /></p><p>Note: Btw, I think I found a mistake in this picture:&nbsp;<a href="/files/attach/images/49/891/003/transaction-lock.png">http://www.cubrid.org/files/attach/images/49/891/003/transaction-lock.png</a>&nbsp;- should read "Transaction 2" on the right, also some minor characters below, such as ?</p><p><br /></p><p>Regards,</p><p>Cristian</p><p></p>]]></description>
                        <pubDate>Wed, 22 Feb 2012 14:20:49 -0800</pubDate>
                        <category>transaction</category>
                        <category>table lock</category>
                                </item>
        										        <item>
            <title>Ruby Driver for CUBRID</title>
            <dc:creator>eye</dc:creator>
            <link>http://www.cubrid.org/forum/195619</link>
            <guid isPermaLink="true">http://www.cubrid.org/forum/195619</guid>
                                    <description><![CDATA[<img src="http://www.cubrid.org/files/attach/images/49/454/001/ruby-on-rails.png" alt="ruby-on-rails.png" /><br /><br />Ruby Driver for CUBRID can be downloaded at <strong><a href="/cubrid_ruby_programming" alt="" title="">Ruby Programming for CUBRID</a></strong> page at CUBRID community site.<br /><br />For the related questions post your messages in this forum.]]></description>
                        <pubDate>Fri, 23 Jul 2010 10:17:31 -0800</pubDate>
                                </item>
        										        <item>
            <title>cannot restore segment prot after reloc: Permission denied</title>
            <dc:creator>manithnoun</dc:creator>
            <link>http://www.cubrid.org/forum/195802</link>
            <guid isPermaLink="true">http://www.cubrid.org/forum/195802</guid>
                                    <description><![CDATA[I already try to install cubrid as the instruction of <!-- m --><a class="postlink" href="http://www.slideshare.net/cubrid/cubrid-installation-on-linux" alt="" title="">http://www.slideshare.net/cubrid/cubrid ... n-on-linux</a><!-- m -->? with CUBRID-8.3.1.0152-el5.i386.rpm on Centos 5.5 .<br />After Installation is successfully but when I start run service of cubrid with this command 'cubrid service start' ,then it show the message below.<br /><br />' cubrid: error while loading shared libraries: /opt/cubrid/lib/libcubridsa.so.8: cannot restore segment prot after reloc: Permission denied '<br />So how could me fixed this ?<br /><br />Best Regard<br />Manith]]></description>
                        <pubDate>Mon, 10 Jan 2011 10:00:20 -0800</pubDate>
                                    <slash:comments>1</slash:comments>
                    </item>
        										        <item>
            <title>Connection String</title>
            <dc:creator>CUBRID</dc:creator>
            <link>http://www.cubrid.org/wiki_apis/entry/connection-string</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_apis/entry/connection-string</guid>
                                    <description><![CDATA[<p>The first thing you need to know in order to open a CUBRID connection from a.NET application is how to build the database connection string.</p>
<p>The format of the CUBRID ADO.NETconnection string is:</p>

<blockquote class="q4"><p>ConnectionString = "server=&lt;<b>server address</b>&gt;;database=&lt;<b>database name</b>&gt;;port=&lt;<b>port number to use for connection to broker</b>&gt;;user=&lt;<b>user name</b>&gt;;password=&lt;<b>user password</b>&gt;;"</p></blockquote>

<p>Notes:</p><p></p><ul><li>All parameters are mandatory, except for the (CUBRID broker) port number.</li><li>If you don't specify the broker port number, the default value assumed is 30000.</li></ul><p></p>


<p><b>Examples</b></p>

<ul>
<li>Connect to a local server, using the default demodb database:<br />
<div editor_component="code_highlighter" code_type="CSharp" file_path="" description="" first_line="1" collapse="false" nogutter="true" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">
ConnectionString = "server=127.0.0.1;database=demodb;port=30000;user=public;password="
</div>
</li>

<li>Connect to a remote server, using the default demodb database, as user dba:<br />
<div editor_component="code_highlighter" code_type="CSharp" file_path="" description="" first_line="1" collapse="false" nogutter="true" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">
ConnectionString = "server=10.50.88.1;database=demodb;user=public;password="
</div>
</li>

<li>Connect to a remote server, using the default demodb database, as user dba, using password "secret":<br />
<div editor_component="code_highlighter" code_type="CSharp" file_path="" description="" first_line="1" collapse="false" nogutter="true" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">
ConnectionString = "server=10.50.99.1;database=demodb;port=30000;user=public;password=secret"
</div></li>
</ul>

<p>As alternative, you can use the CubridConnectionStringBuilder class to build easily a connection string in the correct format. For example:</p>

<p>
</p>
<div editor_component="code_highlighter" code_type="CSharp" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">
CUBRIDConnectionStringBuilder sb = new CUBRIDConnectionStringBuilder(localhost,"33000","demodb","public","");<br />
using (CUBRIDConnection conn = new CUBRIDConnection(sb.GetConnectionString()))<br />
{<br />
conn.Open();<br />
}<br />
</div>
<p></p>

<p>or:</p>

<p>
</p><div editor_component="code_highlighter" code_type="CSharp" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">
sb = new CUBRIDConnectionStringBuilder();<br />
sb.User = "public" ;<br />
sb.Database = "demodb";<br />
sb.Port = "33000";<br />
sb.Server = "localhost";<br />
using (CUBRIDConnection conn = new CUBRIDConnection(sb.GetConnectionString()))<br />
{<br />
conn.Open();<br />
}<br /><br />
</div>
<p></p>]]></description>
                        <pubDate>Wed, 04 Jan 2012 07:31:36 -0800</pubDate>
                        <category>ado.net</category>
                        <category>driver</category>
                        <category>tutorial</category>
                        <category>connection string</category>
                                    <slash:comments>1</slash:comments>
                    </item>
        										        <item>
            <title>Full index of CUBRID Database using Solr DataImportHandler</title>
            <dc:creator>CUBRID</dc:creator>
            <link>http://www.cubrid.org/wiki_tutorials/entry/full-index-of-cubrid-database-using-solr-dataimporthandler</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_tutorials/entry/full-index-of-cubrid-database-using-solr-dataimporthandler</guid>
                                    <description><![CDATA[<p>This tutorial will illustrate an example where a sample data is <span style="font-style: italic;">batch indexed</span> from a CUBRID database and POST'ed into Solr using DataImportHandler. Otherwise it is called a <span style="font-style: italic;">pull approach</span>.<br /></p><p>At this point we assume that you have already completed [Using Solr / Lucene for full text search with CUBRID Database on Ubuntu|previous steps] and have the [Create a sample CUBRID Database from the command line|sample data] in your database.</p><p>In this tutorial we will create a simple <span style="font-style: italic;">single core</span> server which will be located in <span style="font-weight: bold;">~/apache-solr-3.5.0/example/cubrid-solr-example</span> directory.<br /></p><blockquote class="q4"><p>If you do not want to copy/paste all of the following codes, you can download <a href="editor.html?module=file&amp;act=procFileDownload&amp;file_srl=300348&amp;sid=b260ea418d677c4899c64804065e7674">cubrid-solr-example.tar</a>
 and extract it under <span style="font-weight: bold;">example/</span> directory. The contents of this archive include all files from this tutorial.<br /></p></blockquote><p>First, we need to login to <span style="font-weight: bold;">solr</span> user we have created before and navigate to the <span style="font-style: italic;">example/</span> directory.<br /></p><p></p><div editor_component="code_highlighter" code_type="Bash" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;"><p>su - solr<br />cd apache-solr-3.5.0/example/</p></div><p></p><p>Now let's create the home directory structure for our example.</p><p></p><div editor_component="code_highlighter" code_type="Bash" file_path="" description="" first_line="1" collapse="false" nogutter="true" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">mkdir cubrid-solr-example<br />cd cubrid-solr-example<br />mkdir conf lib<br /></div><p></p><p>This will create the following directory structure.</p><p></p><div editor_component="code_highlighter" code_type="Bash" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">~apache-solr-3.5.0/example/<br />-----cubrid-solr-example/<br />----------conf/<br />----------lib/</div><p></p><p>Considering that your are in the home <span style="font-style: italic;">cubrid-solr-example</span> directory, create the main configuration file for solr.<br /></p><p></p><div editor_component="code_highlighter" code_type="Bash" file_path="" description="" first_line="1" collapse="false" nogutter="true" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">touch solr.xml</div><p></p><p>Save the following into this file. This will instruct Solr to create a single core server.</p><p></p><div editor_component="code_highlighter" code_type="Xml" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br /><br />&lt;solr persistent="false"&gt;<br /><br />&nbsp; &lt;cores adminPath="/admin/cores" defaultCoreName="cubrid-example-core"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;core name="cubrid-example-core" instanceDir="." /&gt;<br />&nbsp; &lt;/cores&gt;<br />&nbsp; <br />&lt;/solr&gt;<br /></div><p>Now create a schema file which reflects the database schema of our [Create a sample CUBRID Database from the command line|sample database].</p><p></p><div editor_component="code_highlighter" code_type="Bash" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">cd conf/<br />touch schema.xml</div><p></p><p></p><p>Save the following contents into this file. The following instructs Solr to create a schema for a users table which has 3 columns (id, email, join_date).<br /></p><p></p><div editor_component="code_highlighter" code_type="Xml" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br /><br />&lt;schema name="tbl_users" version="1.0"&gt;<br /><br />&nbsp;&lt;types&gt;<br />&nbsp;&nbsp;&nbsp; &lt;fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/&gt;<br />&nbsp;&lt;/types&gt;<br /><br />&nbsp;&lt;fields&gt;<br />&nbsp;&nbsp; &lt;field name="id" type="tint" indexed="true" stored="true" multiValued="false" required="true" /&gt; <br />&nbsp;&nbsp; &lt;field name="email" type="string" indexed="true" stored="true" multiValued="false" required="true" /&gt;<br />&nbsp;&nbsp; &lt;field name="join_date" type="tint" indexed="true" stored="true" multiValued="false" required="true" /&gt;<br />&nbsp;&lt;/fields&gt;<br /><br />&nbsp;&lt;uniqueKey&gt;id&lt;/uniqueKey&gt;<br />&nbsp;&lt;defaultSearchField&gt;email&lt;/defaultSearchField&gt;<br /><br />&nbsp;&lt;solrQueryParser defaultOperator="OR"/&gt;<br /><br />&lt;/schema&gt;</div><p></p><p>Now create a configuration file for this <span style="font-style: italic;">cubrid-example-core</span> in the same directory.</p><p></p><div editor_component="code_highlighter" code_type="Bash" file_path="" description="" first_line="1" collapse="false" nogutter="true" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">touch solrconfig.xml</div><p></p><p>Add the following to this file. Most of the configurations you see below are default settings. But we will stop on <span style="font-weight: bold;">DataImportHandler</span> and explain it a little bit more.</p><p><a target="_self" href="http://wiki.apache.org/solr/DataImportHandler">DataImportHandler</a> is used to perform batch indexing of an SQL database table. But it is not a native Solr library, therefore it is not loaded by default. We need to instruct Solr to load it by <span style="font-style: italic;">&lt;lib ...&gt;</span> tag. This handler comes with Solr package by default and is located in the <span style="font-weight: bold;">dist/</span> directory in the root of the package. Therefore the path should be relative to the home directory of your example (in our case <span style="font-style: italic;">cubrid-solr-example/</span>) and <span style="font-weight: bold;">not</span> relative to this solrconfig.xml file.</p><p>Further below we create a separate requestHandler for our DataImportHandler which will respond when you navigate to <a target="_self" href="http://localhost:8983/dataimport">http://localhost:8983/dataimport</a> URL. We tell Solr that the configurations for DataImportHandler are located in the <span style="font-style: italic;">/home/solr/apache-solr-3.5.0/example/cubrid-solr-example/conf/data-config.xml</span> file.<br /></p><p></p><div editor_component="code_highlighter" code_type="Xml" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br /><br />&lt;config&gt;<br /><br />&nbsp; &lt;abortOnConfigurationError&gt;${solr.abortOnConfigurationError:true}&lt;/abortOnConfigurationError&gt;<br /><br />&nbsp; &lt;luceneMatchVersion&gt;LUCENE_35&lt;/luceneMatchVersion&gt;<br /><br />&nbsp; &lt;lib dir="../../dist/" regex="apache-solr-dataimporthandler-d.*.jar" /&gt;<br /><br />&nbsp; &lt;directoryFactory name="DirectoryFactory" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/&gt;<br /><br />&nbsp; &lt;updateHandler class="solr.DirectUpdateHandler2" /&gt;<br /><br />&nbsp; &lt;requestDispatcher handleSelect="true" &gt;<br />&nbsp;&nbsp;&nbsp; &lt;requestParsers enableRemoteStreaming="false" /&gt;<br />&nbsp; &lt;/requestDispatcher&gt;<br /><br />&nbsp; &lt;requestHandler name="standard" class="solr.StandardRequestHandler" default="true" /&gt;<br /><br />&nbsp; &lt;requestHandler name="/update" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="solr.JsonUpdateRequestHandler" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startup="lazy" /&gt;<br /><br />&nbsp; &lt;requestHandler name="/admin/" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="solr.admin.AdminHandlers" /&gt;<br /><br />&nbsp; &lt;requestHandler name="/admin/ping" class="solr.PingRequestHandler"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;lst name="invariants"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;str name="qt"&gt;search&lt;/str&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;str name="q"&gt;solrpingquery&lt;/str&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/lst&gt;<br />&nbsp;&nbsp;&nbsp; &lt;lst name="defaults"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;str name="echoParams"&gt;all&lt;/str&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/lst&gt;<br />&nbsp; &lt;/requestHandler&gt;<br />&nbsp; <br />&nbsp; &lt;requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;lst name="defaults"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;str name="config"&gt;/home/solr/apache-solr-3.5.0/example/cubrid-solr-example/conf/data-config.xml&lt;/str&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/lst&gt;<br />&nbsp; &lt;/requestHandler&gt;<br /><br />&nbsp; &lt;admin&gt;<br />&nbsp;&nbsp;&nbsp; &lt;defaultQuery&gt;solr&lt;/defaultQuery&gt;<br />&nbsp; &lt;/admin&gt;<br /><br />&lt;/config&gt;</div><p></p>For DataImportHandler to connect and query a database, it requires a 
JDBC driver of that database server. CUBRID provides a native <a target="_self" href="../../../../wiki_apis/entry/cubrid-jdbc-driver">JDBC Driver</a>. If you have already installed CUBRID in your system, you can find the JDBC driver in <span style="font-weight: bold;">/jdbc</span> directory. In case of Ubuntu <span style="font-style: italic;">apt-get</span> installation, it is located in <span style="font-weight: bold;">/opt/cubrid/jdbc</span>.<blockquote class="q4"><p>If you have not installed CUBRID in your system and plan to connect to a remote CUBRID server, you can download the JDBC driver from the <a target="_self" href="/?mid=downloads&amp;item=jdbc_driver">CUBRID downloads</a> page.</p><p><span style="font-weight: bold;">Important:</span> you need to download the right JDBC driver, i.e. if the version of your remote CUBRID server is 8.4.1, then download JDBC driver for 8.4.1.<br /></p></blockquote><p>Place CUBRID JDBC driver into <span style="font-weight: bold;">/lib</span> directory of <span style="font-style: italic;">cubrid-solr-example</span>. Solr will automatically load any library located in this directory.<br /></p><p>Now we need to create this <span style="font-style: italic;">data-config.xml</span>
 file for DataImportHandler which tells the exact authentication 
information, the exact SELECT query to execute to retrieve the data from
 the database, etc.</p><div style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">touch data-config.xml</div><p>In this file we tell DataImportHandler that:</p><ul><li>it should use CUBRID's JDBC driver;</li><li>in the connection URL we indicate that CUBRID server is installed in the <span style="font-style: italic;">localhost</span>, the broker port is <span style="font-style: italic;">33000</span> (default), and the database name is <span style="font-style: italic;">sample_db</span>;</li><li>the user name is <span style="font-style: italic;">dba</span>;</li><li>no password is needed.</li></ul>

<p>Also we indicate:</p><ul><li> the exact query which should be execute to obtain the data from our database.</li><li>name of fields we created before for our Solr server and the corresponding column names of the database table.</li></ul><p></p>

<div editor_component="code_highlighter" code_type="Xml" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">&lt;dataConfig&gt;<br />&nbsp;&nbsp;&nbsp; &lt;dataSource type="JdbcDataSource" driver="cubrid.jdbc.driver.CUBRIDDriver" url="jdbc:cubrid:localhost:33000:sample_db" user="dba" password=""/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;document name="users"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;entity name="user" query="select * from tbl_users"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field column="ID" name="id" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field column="EMAIL" name="email" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field column="JOIN_DATE" name="join_date" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/entity&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/document&gt;<br />&lt;/dataConfig&gt;</div>

<p>Finally, you should have the following file structure.</p><div style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">~apache-solr-3.5.0/example/<br />-----cubrid-solr-example/<br />----------conf/<br />---------------schema.xml<br />---------------solrconfig.xml<br />---------------data-config.xml<br />----------lib/<br />---------------cubrid_jdbc.jar<br />----------solr.xml<br /></div><p>To confirm if all the configurations are correct, we can now start our Solr instance.</p><p></p><div editor_component="code_highlighter" code_type="Bash" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">cd ~/apache-solr-3.5.0/example<br />java -Dsolr.solr.home="./cubrid-solr-example/" -jar start.jar</div><p></p><p>This should start Solr on port 8983. Navigate to <a target="_self" href="http://localhost:8983/solr/dataimport">http://localhost:8983/solr/dataimport</a>. You should see an XML output which indicates that the configurations are correct. Otherwise, your Solr instance would not start in which case write to our <a target="_self" href="/forum">CUBRID Forum</a>. We will be glad to help you out.</p><p>To import your data from <span style="font-style: italic;">sample_db</span>, first, make sure your database is running.</p><p></p><div editor_component="code_highlighter" code_type="Bash" file_path="" description="" first_line="1" collapse="false" nogutter="true" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(./modules/editor/components/code_highlighter/code.png) no-repeat top right;">cubrid server start sample_db</div><p></p><p>Then navigate to <a target="_self" href="http://localhost:8983/solr/dataimport?command=full-import">http://localhost:8983/solr/dataimport?command=full-import</a> to perform full import. If you see an XML output, Solr may have successfully imported all your data from CUBRID database. To confirm this, you can search for data in Solr admin panel at <a target="_self" href="http://localhost:8983/solr/admin/">http://localhost:8983/solr/admin/</a>. In the <span style="font-weight: bold;">Query String</span> field enter a string which exists in your database. Solr should display the related data if such entry exists.</p><p>At this point you have learnt how to perform batch index of CUBRID database using DataImportHandler. For more examples, see [Using Solr / Lucene for full text search with CUBRID Database on Ubuntu].<br /></p>]]></description>
                        <pubDate>Tue, 21 Feb 2012 23:49:03 -0800</pubDate>
                        <category>Solr</category>
                        <category>full text search</category>
                        <category>DataImportHandler</category>
                        <category>import</category>
                                </item>
        										        <item>
            <title>CUBRID Manager Troublesooting_kr</title>
            <dc:creator>newpcraft</dc:creator>
            <link>http://www.cubrid.org/wiki_tools/entry/cubrid-manager-troublesooting_kr</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_tools/entry/cubrid-manager-troublesooting_kr</guid>
                                    <description><![CDATA[<h3>Q : 오류가 있는 SQL 쿼리를 실행하면 한글로 출력되는 오류 메시지가 깨어져 보입니다.</h3>
<p>우선 CUBRID DBMS의 환경 변수를 확인 합니다.</p><p>$CUBRID_LANG 값이 ko_KR.utf8 로 설정되어 있으면, CUBRID Manager에서 한글로 된 오류 메시지 깨어집니다.</p><p>한글로 출력을 원하신다면 ko_KR.utf8 대신 ko_KR.euckr로 변경하신 후 CUBRID DBMS를 다시 시작하여 주세요.</p><p>영문으로 출력을 원하신다면 en_US.UTF-8로 변경하시면 됩니다.</p>
<p><br /></p>

<h3>Q : csql에서는 Java Procedure 실행시 한글 깨지지 않는데, CUBRID Manager나 CUBRID Query Browser에서는 한글이 깨어집니다.</h3>
<p>CUBRID Manager와 데이터 및 Java Procedure의 문자집합을 동일하게 맞춰주어야 깨어지지 않습니다. 연결시 문자집합에 UTF-8 또는 EUC-KR 등 서로 동일하게 맞춰주면 이상없이 결과가 출력됩니다.</p>
<p><br /></p>

<h3>Q : CUBRID Manager로 demodb를 시작하자마자 종료가 되며, standalone이라는 메시지도 출력되었습니다.</h3>
<p>서버에서 standalone이 나오는 경우는 서버가 완전히 종료되지 않은 상태에서 다시 시작을 했을 경우 입니다. 완전히 종료한 후에 다시 시작하십시오.</p>]]></description>
                        <pubDate>Wed, 22 Feb 2012 01:31:04 -0800</pubDate>
                        <category>CM</category>
                        <category>manual</category>
                                </item>
        										        <item>
            <title>SHOW CREATE TABLE Support</title>
            <dc:creator>Cristian Romanescu</dc:creator>
            <link>http://www.cubrid.org/forum/300136</link>
            <guid isPermaLink="true">http://www.cubrid.org/forum/300136</guid>
                                    <description><![CDATA[<p>I need to extract the table definition from SQL, is there support for this? In MySQL I would use SHOW CREATE TABLE.</p><p>I looked into the documentation, but I only found support for SHOW CREATE VIEW functionality.</p><p><br /></p><p>I've found out that for 8.4.0 is not supported, but I cannot find the "New features" for 8.4.1. Could you please point out the correct link?</p><p><br /></p><p>Thanks,</p><p>Cristian</p>]]></description>
                        <pubDate>Tue, 21 Feb 2012 12:08:20 -0800</pubDate>
                                    <slash:comments>2</slash:comments>
                    </item>
        										        <item>
            <title>CUBRID Manager Manual_kr</title>
            <dc:creator>newpcraft</dc:creator>
            <link>http://www.cubrid.org/wiki_tools/entry/cm_manual_kr</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_tools/entry/cm_manual_kr</guid>
                                    <description><![CDATA[<h2>소개</h2>

<p>CUBRID 매니저는 GUI 환경에서 CUBRID 데이터베이스 관리 및 질의 기능을 제공하는 CUBRID 데이터베이스 전용 
관리 도구이다. CUBRID 매니저를 사용하면 CUBRID 데이터베이스의 관리 작업을 GUI를 이용하여 쉽게 할 수 있다. 또한, CUBRID 매니저는 데이터베이스 관리 및 응용 개발에 필수적인 질의 편집기 도구를 제공한다.</p>
<p><br /></p>

<p>CUBRID 매니저는 CUBRID DBMS가 설치된 서버에서 동작하는 매니저 서버와 GUI 기반의 클라이언트로 
구성되어 있다. CUBRID 매니저 클라이언트 프로그램은 Java 및 Eclipse의 RCP로 제작되었으며 Java가 실행될 수 있는 환경(Java Runtime Environment)이면 사용 
가능하다.</p>
<p><br /></p>

<h2>목차</h2>

<h3>1. [CUBRID Manager Introduce_kr|CUBRID 매니저 소개]</h3>
<h3>2. [CUBRID Manager Installation_kr|CUBRID 매니저 설치]</h3>
<h3>3. [CUBRID Manager Getting Started_kr|CUBRID 매니저 시작하기]</h3>
<h3>4. [CUBRID Manager Reference_kr|CUBRID 매니저 기능 설명]</h3>
<h3>5. [CUBRID Manager Monitoring_kr|CUBRID 매니저 모니터링]</h3>
<h3>6. [CUBRID Manager Configuration_kr|CUBRID 매니저 환경설정]</h3>
<h3>7. [CUBRID Manager Advanced Usage_kr|CUBRID 매니저 고급 사용]</h3>
<h3>8. [CUBRID Manager Troublesooting_kr|CUBRID 매니저 오류 해결 사례]</h3>]]></description>
                        <pubDate>Sat, 31 Dec 2011 07:17:06 -0800</pubDate>
                        <category>manual</category>
                        <category>CM</category>
                                </item>
        										        <item>
            <title>CUBRID Tutorials</title>
            <dc:creator>CUBRID</dc:creator>
            <link>http://www.cubrid.org/wiki_tutorials/entry/Front Page</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_tutorials/entry/Front Page</guid>
                                    <description><![CDATA[<h2>Quick Start</h2><p>It is very easy to get started with CUBRID. Follow these step-by-step tutorials and you will see how fun it is to learn CUBRID.</p><p></p><ul><li>Follow [CUBRID Installation Instructions] (Windows, Linux)</li><li><a href="/manual/840/en/Starting%20the%20CUBRID%20Service" target="_self">Start CUBRID Service</a></li><li>[Create a sample CUBRID Database from the command line]</li></ul><h3>Easy Database Administration</h3><p></p><ul><li><a href="/?mid=downloads&amp;item=cubrid_manager&amp;os=detect" target="_self">Download CUBRID Manager</a>&nbsp;(Windows, Linux, Mac OS X)</li><li><a href="/run_cubrid_manager_on_mac" target="_self">Run CUBRID Manager</a>. This tutorial will show you how to:</li><ul><li>Add and Connect to a host</li><li>Login to and&nbsp;Start a database</li><li>Execute queries (SELECT, UPDATE, DELETE)</li></ul><li>More details are available at <a href="/wiki_tools/entry/cubrid-manager-manual" target="_self">CM Manual</a>.</li></ul><p></p><p></p><h3>Install CUBRID Database Drivers</h3><p></p><ul><li><a href="/wiki_apis/entry/cubrid-php-driver-installation-instructions" target="_self">PHP Driver</a></li><li><a href="/wiki_apis/entry/cubrid-pdo-driver-installation-instructions" target="_self">PDO Driver</a></li><li><a href="/wiki_apis/entry/cubrid-python-driver-installation-instructions" target="_self">Python Driver</a></li><li><a href="/wiki_apis/entry/cubrid-perl-driver-build-guide" target="_self">Perl Driver</a></li><li><a href="/wiki_apis/entry/cubrid-ruby-driver-installation-instructions" target="_self">Ruby Driver</a></li><li><a href="/wiki_apis/entry/cubrid-ado-net-driver-installation-guide" target="_self">ADO.NET Driver</a></li><li><a href="/wiki_apis/entry/cubrid-odbc-driver-installation-instructions" target="_self">ODBC Driver</a></li><li><a href="/wiki_apis/entry/cubrid-odbc-driver-installation-instructions" target="_self">OLEDB Driver</a></li><li><a href="/wiki_apis/entry/setting-java-environment-path" target="_self">JDBC Driver</a></li></ul>

<h3>Have Questions?</h3><p>So far so easy! But if you have questions, head to <a href="/questions" target="_self">CUBRID Q&amp;A site</a>. If you run into issues, post them on <a href="/forum" target="_self">CUBRID Forum</a>. We will be very glad to help you out!</p>

<h2>Going Further</h2><p></p><ul><li>[CUBRID Configurations]</li><li>[Important Facts to Know about CUBRID]</li></ul><h3>CUBRID SQL Tutorials</h3>

<ul>
<li>[CUBRID RDBMS Size Limits]</li><li><a href="/cubrid_query_tuning" target="_self">CUBRID Query Tuning</a></li>
<li><a href="/cubrid_covering_index" target="_self">What is Covering Index in CUBRID 8.4.0?</a></li>
<li><a href="/cubrid_click_counter" target="_self">CUBRID Click Counter</a></li>
<li><a href="/query_tuning_results" target="_self">Increasing Database Performance by Query Tuning</a></li>
<li><a href="/concat_different_row_columns">How to Concatenate Column Values from Different Rows</a></li>
<li><a href="/cubrid_serial" target="_self">CUBRID Serials</a></li>
<li><a href="/cubrid_database_information" target="_self">Database Information in CUBRID</a></li>
<li><a href="/manual/840/en/CUBRID%20SQL%20Guide" target="_self">CUBRID SQL Guide</a></li>
<li><a class="pdf" href="ftp://ftp.cubrid.org/CUBRID_Docs/Tutorials/cubrid-hierarchical-query.pdf" target="_self">CUBRID Hierarchical Queries</a></li><li>[Working with CUBRID BLOB / CLOB Data Types]</li></ul>

<h3>Advanced CUBRID Server Topics</h3>

<ul>
<li>CUBRID Architecture</li>
<ul>
<li><a href="/cubrid_architecture_components" target="_self">CUBRID Inside - Architecture, Source &amp; Management Components</a></li>
<li><a href="/cubrid_architecture_sns" target="_self">CUBRID Reference Architecture for Social Networking Service</a></li>
<li><a href="/release_policy" target="_self">CUBRID Release Policy</a></li>
<li><a href="/cubrid_architecture" target="_self">The Architecture of CUBRID</a></li>
<li><a href="http://blog.cubrid.org/cubrid-story/architecture-of-cubrid/" target="_blank">Architecture of CUBRID</a>&nbsp;- Blog article</li>
<li><a href="http://blog.cubrid.org/cubrid-story/the-cubrid-broker-story/" target="_self">The CUBRID Broker Story</a></li></ul>
<li>CUBRID Performance</li>
<ul>
<li><a href="/cubrid_840_key_features" target="_self">CUBRID 8.4.0 Key Features</a></li>
<li><a class="pdf" href="ftp://ftp.cubrid.org/CUBRID_Docs/Release_Notes/CUBRID2008R4.0_QA_Completion_Report.pdf" target="_self">CUBRID 8.4.0 QA Completion Report</a></li>
<li><a href="/cubrid_volume_space_reusability_test" target="_self">CUBRID 8.4.0 vs. 8.3.1 Volume Space Reusability Comparison</a></li>
<li><a href="/cubrid_mysql_sns_benchmark_test" target="_self">CUBRID vs. MySQL Benchmark Test Results for SNS Data and Workload</a></li>
<li><a href="/query_tuning_results" target="_self">Increasing Database Performance by Query Tuning</a></li>
<li><a href="/ssd_performance_test" target="_self">CUBRID vs. MySQL performance test results before and after the SSD usage</a></li>
<li><a href="/benchmark_result" target="_self">NBD Benchmark Results</a></li></ul>
<li><a class="ss" title="View SlideShare Presentation" href="http://www.slideshare.net/cubrid/cubrid-developers-course" target="_blank">CUBRID Developer's Course</a><a class="pdf" title="Download this Presentation in PDF" href="/files/docs/misc/CUBRID Developer's Course.pdf" target="_self"></a></li>
<li><a href="/intro_cubrid_security" target="_self">Introduction to CUBRID Security - Part I</a><a class="pdf" title="Download this Presentation in PDF" href="/files/docs/tutorials/cubrid/Introduction to CUBRID Security - Part I.pdf" target="_self"></a></li>
<li><a href="/intro_cubrid_security_2" target="_self">Introduction to CUBRID Security - Part II</a><a class="pdf" title="Download this Presentation in PDF" href="/files/docs/tutorials/cubrid/Introduction to CUBRID Security - Part II.pdf" target="_self"></a></li>
<li>CSQL Interpreter</li>
<ul>
<li><a href="/how_to_use_csql_utilities" target="_self">How to Use CSQL (CUBRID SQL Interpreter)</a></li>
<li><a href="http://blog.cubrid.org/cubrid-story/csql-interpreter/" target="_blank">CSQL - Command Line SQL Interpreter</a>&nbsp;- Blog article</li></ul>
<li><a href="/server_error_mesages" target="_self">Server Error Msg</a></li>
<li><a href="/cubrid_log_files">CUBRID Log Files</a><a class="pdf" title="Download this tutorial in PDF" href="/files/docs/tutorials/cubrid/CUBRID%20Log%20files.pdf"></a></li>
<li><a href="/transaction_and_lock" target="_self">CUBRID Transaction and Lock</a></li>
<li>CUBRID HA</li>
<ul>
<li><a href="/cubrid_ha_process" target="_self">How CUBRID HA Works?</a></li>
<li><a class="pdf" title="Download this Presentation in PDF" href="/files/docs/misc/CUBRID HA Starting Guide.pdf">CUBRID HA Starting Guide</a></li>
<li><a href="http://blog.cubrid.org/cubrid-story/overview-of-new-high-availability-features-in-cubrid-3-2/" target="_blank">Overview of New High-Availability Features in CUBRID 8.4.0</a>&nbsp;- Blog article</li>
<li><a href="http://blog.cubrid.org/cubrid-story/database-sharding-with-cubrid/" target="_self">Database Sharding with CUBRID</a> - Blog article</li>
<li><a href="ftp://ftp.cubrid.org/CUBRID_Docs/Tutorials/cubrid-sharding-user-spec.pdf" target="_self">CUBRID Database Sharding User Specifications</a></li>
<li><a href="/cubrid_ha_oscon" target="_self">CUBRID HA - Guaranteed Way to Never-Die Web Services - OSCON 2011</a></li></ul>
<li><a href="/cubrid_automated_scripts_hosting_service" target="_self">CUBRID Automated Scripts for DB Hosting Service</a></li>
<li>Backup &amp; Restore</li>
<ul>
<li><a href="/backup_cubrid_database" target="_self">How to Backup a Database in CUBRID</a></li>
<li><a href="/restore_cubrid_database" target="_self">How to Restore a Database in CUBRID</a></li>
<li><a href="/cubrid_backup_restore">CUBRID Backup &amp; Restore - Part I (Backup)</a></li>
<li><a href="/cubrid_backup_restore_2">CUBRID Backup &amp; Restore - Part II (Restore)</a></li>
<li><a href="/import_large_file" target="_self">How to Efficiently Import Large Files in CUBRID</a></li></ul>
<li><a href="/cubrid_triggers" target="_self">CUBRID Triggers</a></li></ul>

<h2>More Tutorials</h2>

<ul>
<li><a href="/wiki_tutorials/entry/Connection_Management_and_Threads_in_CUBRID_Server" target="_self">Connection Management and Threads in Cubrid Server</a></li>
<li><a href="/wiki_tutorials/entry/CUBRID_Query_Processing" target="_self">Cubrid Query Processing</a></li>
<li><a href="/wiki_tutorials/entry/CUBRID_Service_through_CUBRID_Manager" target="_self">Cubrid Service through CUBRID Manager</a></li>
<li><a href="/wiki_tutorials/entry/Data_Structures" target="_self">Data Structures</a></li>
<li><a href="/wiki_tutorials/entry/Install_PHP" target="_self">Install PHP</a></li>
<li><a href="/wiki_tutorials/entry/Port_MySQL_Compatible_PHP_Applications_to_CUBRID" target="_self">Port MySQL Compatible Applications to CUBRID</a></li>
<li><a href="/wiki_tutorials/entry/RCP_Application" target="_self">RCP Application</a></li>
<li><a href="/wiki_tutorials/entry/Server_Startup/Shutdown_Process" target="_self">Server Startup/Shutdown Process</a></li><li>[Using Solr / Lucene for full text search with CUBRID Database on Ubuntu]</li>
</ul>]]></description>
                        <pubDate>Tue, 20 Dec 2011 05:59:29 -0800</pubDate>
                        <category>CUBRID</category>
                        <category>tutorials</category>
                                </item>
        										        <item>
            <title>Script lose connection with cubrid broker.</title>
            <dc:creator>penguin</dc:creator>
            <link>http://www.cubrid.org/forum/195775</link>
            <guid isPermaLink="true">http://www.cubrid.org/forum/195775</guid>
                                    <description><![CDATA[Hi everybody. Sorry for my english.<br />I don't know, how it's work. But when i use long time connection to database with php. Cubrid (may be cubrid extension for php?) drop connection and all queries not work.<br /><br />You can reproduce this by install cubrid, add php extension, create database and run next script<br /><br /><code><br />&lt;?php<br /><br />set_time_limit(0);<br />$user = &quot;dba&quot;;<br />$password = &quot;1111&quot;;<br />$host_ip = &quot;localhost&quot;;<br />$host_port = 33000;<br />$db_name = &quot;test&quot;;<br /><br />$count_of_units = 1000000;<br /><br />if (!($con = cubrid_connect($host_ip, $host_port, $db_name, $user, $password)))<br />{<br />    echo 'Connetion error';<br />    echo cubrid_error_msg();<br />    exit;<br />}<br />for($i = 1; $i &lt;= $count_of_units; $i++)<br />{<br />    $rnd = rand(1,1000);<br />    $req = cubrid_execute($con, &quot;insert into tbl_test (`some`) values ({$rnd})&quot;);<br />    if($req)<br />    {<br />         cubrid_commit($con);<br />    }<br />    else<br />    {<br />         echo 'Bug: ';<br />         echo cubrid_error_msg();<br />         break;<br />    }<br />}<br /><br />cubrid_disconnect($con);<br /></code><br /><br />Table tbl_test structure in attachement.<br /><br />After over 500000 queries connection freezes. I think, that is associated with some brokers' settings, but i not sure. I use all by default.<br /><br />configuration 1:<br />windows, xampp 1.7.3, cubrid 3.0, php 5.3.x cubrid module from official site (vc6)<br />configuration 2:<br />linux, apache 2.3, php 5.3.3, cubrid 3.0, php cubrid module from pecl.]]></description>
                        <pubDate>Sat, 01 Jan 2011 00:31:06 -0800</pubDate>
                                    <slash:comments>4</slash:comments>
                    </item>
        										        <item>
            <title>CUBRID Query Browser Roadmap_kr</title>
            <dc:creator>newpcraft</dc:creator>
            <link>http://www.cubrid.org/wiki_tools/entry/cubrid-query-browser-roadmap_kr</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_tools/entry/cubrid-query-browser-roadmap_kr</guid>
                                    <description><![CDATA[<h1>2012년</h1>

<h2>1Q</h2>
<ul>
<li>CUBRID Query Browser 8.4.1 (2012.01) - CUBRID 8.4.1 beta 지원<br /></li><li>CUBRID Query Browser 8.4.1 patch 1 (2012.02~2012.03) - 다중 호스트 다중 쿼리 지원, 온라인 메뉴얼 WIKI 전환</li>
</ul>

<h2>2Q</h2>
<ul>
<li>CUBRID Query Browser 8.4.1 patch 2 (2012.04~2012.05) - UX 개선<br /></li></ul>

<h2>3Q</h2>
<ul>
<li>CUBRID Query Browser 2 (2012.06~2012.07) - User management<br /></li>
<li>CUBRID Query Browser 2 patch 1 (2012.08~2012.09) - Query Performance Builder<br /></li>
</ul>

<h2>4Q</h2>
<ul>
<li>CUBRID Query Browser 2 patch 2 (2012.10~2012.11) - Schema Designer<br /></li>
<li>CUBRID Developer Suite (2012.12~2013.01) - CUBRID Manager / Query Browser 통합 (개발자, 관리자 모드 전환)</li>
</ul>

<p><br /></p>]]></description>
                        <pubDate>Tue, 21 Feb 2012 06:09:09 -0800</pubDate>
                        <category>CQB</category>
                        <category>Roadmap</category>
                                </item>
        										        <item>
            <title>CUBRID Manager Roadmap_kr</title>
            <dc:creator>newpcraft</dc:creator>
            <link>http://www.cubrid.org/wiki_tools/entry/cubrid-manager-roadmap_kr</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_tools/entry/cubrid-manager-roadmap_kr</guid>
                                    <description><![CDATA[<h1>2012년</h1>

<h2>1Q</h2>
<ul>
<li>CUBRID Manager 8.4.1 (2012.01) - CUBRID 8.4.1 beta 지원<br /></li><li>CUBRID Manager 8.4.1 patch 1 (2012.02~2012.03) - 다중 호스트 다중 쿼리 지원, 온라인 메뉴얼 WIKI 전환</li>
</ul>

<h2>2Q</h2>
<ul>
<li>CUBRID Manager 8.4.1 patch 2 (2012.03~2012.04) - 안정화</li>
<li>CUBRID Manager 2 (2012.04~2012.05) - 새로운 UX, 편의성 강화</li>
</ul>

<h2>3Q</h2>
<ul>
<li>CUBRID Manager 2 patch 1 (2012.05~2012.06) - Next CUBRID DBMS Engine 지원</li>
<li>CUBRID Manager 2 patch 2 (2012.07~2012.08) - CUBRID Manager Server 2 지원</li>
</ul>

<h2>4Q</h2>
<ul>
<li>CUBRID Manager 2 patch 3 (2012.09~2012.10) - 안정화, 모니터링 고도화</li>
<li>CUBRID Developer Suite (2012.12~2013.01) - CUBRID Manager / Query Browser 통합 (개발자, 관리자 모드 전환)</li>
</ul>

<p><br /></p>]]></description>
                        <pubDate>Tue, 21 Feb 2012 02:46:20 -0800</pubDate>
                        <category>CM</category>
                        <category>Roadmap</category>
                                </item>
        										        <item>
            <title>CUBRID Migration Toolkit Roadmap_kr</title>
            <dc:creator>newpcraft</dc:creator>
            <link>http://www.cubrid.org/wiki_tools/entry/cubrid-migration-toolkit-roadmap_kr</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_tools/entry/cubrid-migration-toolkit-roadmap_kr</guid>
                                    <description><![CDATA[<h1>2012년</h1>

<h2>1Q</h2>
<ul>
<li>CUBRID Migration Toolkit 2 8.4.1 (2012.01) - 고속 마이그레이션 지원 (JDBC 성능향상, LoadDB 기본 지원)
</li><li>CUBRID Migration Toolkit 2 8.4.1 patch 1 (2012.02) - 오프라인 LoadDB 지원, 온라인 메뉴얼 WIKI 전환</li>
</ul>

<h2>2Q</h2>
<ul>
<li>CUBRID Migration Toolkit 2 8.4.1 patch 2 (2012.03~2012.04) - Linux console migration 지원</li>
</ul>

<h2>3Q</h2>
<ul>
<li>CUBRID Migration Toolkit 2 8.4.1 patch 3 (2012.05~2012.06) - mysqldump(sql) migration 지원</li>
<li>CUBRID Migration Toolkit 2 8.4.1 patch 4 (2012.07~2012.09) - 고속/대용량 Oracle migration 지원</li></ul>

<h2>4Q</h2>
<ul>
<li>CUBRID Migration Toolkit 2 8.4.1 patch 4 (2012.10~2012.12) - 마이그레이션 전/후 데이터 정합성 테스트 지원 (고도화)</li>
</ul>

<p><br /></p>]]></description>
                        <pubDate>Tue, 21 Feb 2012 06:24:29 -0800</pubDate>
                        <category>CMT</category>
                        <category>Roadmap</category>
                                </item>
        										        <item>
            <title>CUBRID Migration Toolkit</title>
            <dc:creator>newpcraft</dc:creator>
            <link>http://www.cubrid.org/wiki_tools/entry/cubrid-migration-toolkit</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_tools/entry/cubrid-migration-toolkit</guid>
                                    <description><![CDATA[<p>CUBRID Migration Toolkit (CMT) is a software tool which allows to migrate data from MySQL/Oracle/MSSQL/CUBRID (previous versions) to CUBRID Database Server.</p><p>The data and schema in the source database can be as sofisticated as possible. CMT provides the default settings to cast native MySQL and other DBMS data types to native CUBRID data types, though most of them will overlap as CUBRID provides over 90% MySQL compatibility. If it is necessary to have the destination column data type different from the default settings, it can be easily customized before the migration process starts.<br /></p>

<div class="grid col2">
                    <span><ul>
                        <li>Development Roadmap ([CUBRID Migration Toolkit Roadmap_kr|한글])<br /></li><li><a href="/wiki_tools/entry/cubrid-migration-tool-key-features" target="_self">Key features</a></li>
                        <li><a href="/?mid=downloads&amp;item=cubrid_migration_toolkit&amp;os=detect" target="_self">Download</a></li><li><a href="/wiki_tools/entry/cubrid-migration-tool-installation-instructions" target="_self">Installation Instructions</a></li><li><a href="/wiki_tools/entry/cubrid-migration-toolkit-tutorials" target="_self">Tutorials</a></li><li><a href="/questions" target="_self">Questions&nbsp;and Answers</a></li>
                    </ul></span>
                    <span><ul>
                        <li>Release Notes ([CUBRID Migration Toolkit Release Note|English], [CUBRID Migration Toolkit Release Note_kr|한글])</li><li>Online Manual ([CUBRID Migration Toolkit Manual|English], [CUBRID Migration Toolkit Manual_kr|한글])</li>
                        <li>[CUBRID Migration Toolkit QA Report|QA Report]</li><li><a href="http://jira.cubrid.org/browse/TOOLS/component/10002" target="_self">JIRA Issue Tracker</a></li></ul></span></div><p>CMT is&nbsp;distributed under the terms of&nbsp;<a href="/bsd_license" target="_self">BSD open source license</a>.</p><p>


</p>]]></description>
                        <pubDate>Thu, 29 Dec 2011 20:32:34 -0800</pubDate>
                        <category>CMT</category>
                                </item>
        										        <item>
            <title>Limit operation resource for users</title>
            <dc:creator>quartex</dc:creator>
            <link>http://www.cubrid.org/forum/195637</link>
            <guid isPermaLink="true">http://www.cubrid.org/forum/195637</guid>
                                    <description><![CDATA[Hi,<br />for a shared enviroment (like hosting one and not) will be vital to have limitation for users resource.<br />For Mysql is possible limit select, update, connection in a hour but is only a rudimental thing and not so &quot;serious&quot;. Immagine this :<br />I am a DBA and I want to limit my 50 users to not kill my db and limit to 30 select hours all users.<br />I think to solve all problem with this limitation<br />Yes but ... 3 of my users join 4 tables with a result of 10000000 records because are not expert with SQL or for a wrong select using ONLY a connection and 1 query and my db is hanged for a while<br />The idea is limit the resource for users that are using in the same time the db resource.<br />The best will be to have a dynamic resource with a % for each users like a thread manager for linux<br />But a max time for operation in millisecond will be a great thing to have a better security and I think more easy to implement.]]></description>
                        <pubDate>Sun, 13 Jun 2010 17:31:07 -0800</pubDate>
                                    <slash:comments>7</slash:comments>
                    </item>
        										        <item>
            <title>CUBRID Manager</title>
            <dc:creator>newpcraft</dc:creator>
            <link>http://www.cubrid.org/wiki_tools/entry/cubrid-manager</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_tools/entry/cubrid-manager</guid>
                                    <description><![CDATA[<p>CUBRID Manager (CM) is the most powerful database administration tool developed with <i>DBAs in mind</i>. It has a convenient and intuitive Graphical User Interface (GUI) and provides powerful tools to manage the databases, brokers, execute queries and view their results, and many more.</p>

<div class="grid col2">
                    <span><ul>
                        <li>Development Roadmap ([CUBRID Manager Roadmap_kr|한글])<br /></li><li><a href="/wiki_tools/entry/cubrid-manager-key-features" target="_self">Key features</a></li>
                        <li><a href="/?mid=downloads&amp;item=cubrid_manager&amp;os=detect" target="_self">Download</a></li><li><a href="/wiki_tools/entry/cubrid-manager-installation-instructions" target="_self">Installation Instructions</a></li><li><a href="/wiki_tools/entry/cubrid-manager-news-and-tutorials" target="_self">Latest News, Guides and Tutorials</a></li><li><a href="/?mid=questions&amp;tag=CM" target="_self">CM specific Questions&nbsp;and Answers</a></li>
                    </ul></span>
                    <span><ul>
                        <li>Release Notes&nbsp;([CUBRID Manager Release Note|English], [CUBRID Manager Release Note_kr|한글])</li><li>Online Manual ([CUBRID Manager Manual|English], [CUBRID Manager Manual_kr|한글])</li>
                        <li>[CUBRID Manager QA Report|QA Report]</li><li><a href="http://jira.cubrid.org/browse/TOOLS/component/10000" target="_self">JIRA Issue Tracker</a></li></ul></span></div><p>CM is&nbsp;distributed under the terms of&nbsp;<a href="/bsd_license" target="_self">BSD open source license</a>.</p><p>A lighter version of CM called [CUBRID Query Browser] is available for developers. CQB may be more suitable for its simplicity and Eclipse pluggable feature.</p><p>


</p>]]></description>
                        <pubDate>Thu, 29 Dec 2011 00:51:41 -0800</pubDate>
                        <category>CM</category>
                                </item>
        										        <item>
            <title>CUBRID Query Browser</title>
            <dc:creator>newpcraft</dc:creator>
            <link>http://www.cubrid.org/wiki_tools/entry/cubrid-query-browser</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_tools/entry/cubrid-query-browser</guid>
                                    <description><![CDATA[<p>The CUBRID Query Browser (CQB) is the lightweight version of the <a href="/wiki_tools/entry/cubrid-manager" target="_self">CUBRID Manager</a>. It is implemented with developers in mind who need a faster solution to execute SQL statements, both standard and prepared, and manage tables more conveniently.</p>

<div class="grid col2"><span><ul><li>Development Roadmap ([CUBRID Query Browser Roadmap_kr|한글])<br /></li><li><a href="/wiki_tools/entry/cubrid-query-browser-key-features" target="_self">Key features</a></li><li><a href="/?mid=downloads&amp;item=cubrid_query_browser&amp;os=detect" target="_self">Download</a></li><li><a href="/wiki_tools/entry/cubrid-query-browser-installation-instructions" target="_self">Installation Instructions</a></li><li><a href="/questions" target="_self">Questions&nbsp;and Answers</a></li></ul></span><span><ul><li>Release Notes ([CUBRID Query Browser Release Notes|English], [CUBRID Query Browser Release Note_kr|한글])</li><li>Online Manual ([CUBRID Query Browser Manual|English], [CUBRID Query Browser Manual_kr|한글], <a href="ftp://ftp.cubrid.org/CUBRID_Docs/CQB/CUBRID-Query-Browser-1.1-Manual-en.pdf" target="_self">PDF</a>)</li><li>[CUBRID Query Browser QA Report|QA Report]</li><li><a href="http://jira.cubrid.org/browse/TOOLS/component/10001" target="_self">JIRA Issue Tracker</a></li></ul></span></div><p>CQB is&nbsp;distributed under the terms of&nbsp;<a href="/bsd_license" target="_self">BSD open source license</a>.</p><p>

</p>]]></description>
                        <pubDate>Thu, 29 Dec 2011 18:44:24 -0800</pubDate>
                        <category>CQB</category>
                                </item>
        										        <item>
            <title>Understanding JVM Internals</title>
            <dc:creator>Se Hoon Park</dc:creator>
            <link>http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/</link>
            <guid isPermaLink="true">http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/</guid>
                        <comments>http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/#comment</comments>
                                    <description><![CDATA[<p>Every developer who uses Java knows that Java bytecode runs in a JRE (Java Runtime Environment). The most important element of the JRE is <b>Java Virtual Machine</b> (JVM), which analyzes and executes Java byte code. Java developers do not need to know how JVM works.&nbsp;So many great applications and libraries have already&nbsp;been&nbsp;developed without developers understanding JVM deeply.&nbsp;However, if you understand JVM, you will understand Java more, and will be able to solve the problems which seem to be so simple but unsolvable.</p><p>Thus, in this article I will explain how JVM works, its structure, how it executes Java bytecode, the order of execution, examples of common mistakes and their solutions, as well as the new features in Java SE 7 Edition.</p><p></p><h2>Virtual Machine</h2><p><b><span class="Apple-style-span" style="font-weight: normal; ">The JRE is composed of the Java API and the JVM. The role of the JVM is to read the Java application through the Class Loader and execute it along with the Java API.</span></b></p><p><b>A virtual machine</b> (VM) <i>is a software implementation of a machine (i.e. a computer) that executes programs like a physical machine</i>. Originally, Java was designed to run based on a virtual machine separated from a physical machine for implementing <b>WORA</b> (<i>Write Once Run Anywhere</i>), although this goal has been mostly forgotten. Therefore, the JVM runs on all kinds of hardware to execute the <b>Java Bytecode</b> without changing the Java execution code.</p><p>The features of JVM are as follows:</p><p></p><ul><li><b>Stack-based virtual machine</b>: The most popular computer architectures such as Intel x86 Architecture and ARM Architecture run based on a&nbsp;<i>register</i>. However, <i>JVM runs based on a stack</i>.</li><li><b>Symbolic reference</b>: All types (class and interface) except for primitive data types are referred to through symbolic reference, instead of through explicit memory address-based reference.&nbsp;</li><li><b>Garbage collection</b>: A class instance is explicitly created by the user code and automatically destroyed by garbage collection.</li><li><b>Guarantees platform independence by clearly defining the primitive data type</b>: A traditional language such as C/C++ has different int type size according to the platform. The JVM clearly defines the primitive data type to maintain its compatibility and guarantee platform independence.</li><li><b>Network byte order</b>: The Java class file uses the network byte order. To maintain platform independence between the little endian used by Intel x86 Architecture and the big endian used by the RISC Series Architecture, a fixed byte order must be kept. Therefore, JVM uses the network byte order, which is used for network transfer. The network byte order is the big endian.</li></ul><p></p><p>Sun Microsystems developed Java. However, any vendor can develop and provide a JVM by following the Java Virtual Machine Specification. For this reason, there are various JVMs, including Oracle Hotspot JVM and IBM JVM. The Dalvik VM in Google's Android operating system is a kind of JVM, though it does not follow the Java Virtual Machine Specification. Unlike Java VMs, which are stack machines, the Dalvik VM is a register-based architecture. Java bytecode is also converted into an register-based instruction set used by the Dalvik VM.</p><h2>Java bytecode</h2><p>To implement WORA, the JVM uses Java bytecode, a middle-language between Java (user language) and the machine language. This Java bytecode is the smallest unit that deploys the Java code.</p><p>Before explaining the Java bytecode, let's take a look at it. This case is a summary of a real example that has occurred in development process.</p><h3>Symptom</h3><p>An application that had been running successfully no longer runs. Moreover, returns the following error after the library has been updated.</p><p></p><div editor_component="code_highlighter" code_type="Java" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(/modules/editor/components/code_highlighter/code.png) no-repeat top right;"><p>Exception in thread "main" java.lang.NoSuchMethodError: com.nhn.user.UserAdmin.addUser(Ljava/lang/String;)V<br />&nbsp; &nbsp; at com.nhn.service.UserService.add(UserService.java:14)<br />&nbsp; &nbsp; at com.nhn.service.UserService.main(UserService.java:19)</p></div><p></p><p></p><p>The application code is as follows, and no changes to it have been made.</p><p></p><div editor_component="code_highlighter" code_type="Java" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(/modules/editor/components/code_highlighter/code.png) no-repeat top right;"><p>// UserService.java<br />…<br />public void add(String userName) {<br />&nbsp; &nbsp; admin.addUser(userName);<br />}</p></div><p></p><p></p><p>The updated library source code and the original source code are as follows.</p><p></p><div editor_component="code_highlighter" code_type="Java" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(/modules/editor/components/code_highlighter/code.png) no-repeat top right;"><p>// UserAdmin.java - Updated library source code<br />…<br />public User addUser(String userName) {<br />&nbsp; &nbsp; User user = new User(userName);<br />&nbsp; &nbsp; User prevUser = userMap.put(userName, user);<br />&nbsp; &nbsp; return prevUser;<br />}<br />// UserAdmin.java - Original library source code<br />…<br />public void addUser(String userName) {<br />&nbsp; &nbsp; User user = new User(userName);<br />&nbsp; &nbsp; userMap.put(userName, user);<br />}</p></div><p></p><p>In short, the addUser() method which has no return value has been changed to a method that returns the User class instance. However, the application code has not been changed, since it does not use the return value of the addUser() method.</p><blockquote class="q1"><p>At first glance, the com.nhn.user.UserAdmin.addUser() method seems to still exist, but if so, <b>why does NoSuchMethodError occur?</b></p></blockquote><h3>Reasons</h3><p>The reason is that the application code has not been compiled to a new library. In other words, the application code seems to invoke methods regardless of the return value. However, the compiled class file indicates the method that has a return value.</p><p>You will see this through the following error message.</p><p></p><div editor_component="code_highlighter" code_type="Java" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(/modules/editor/components/code_highlighter/code.png) no-repeat top right;">java.lang.NoSuchMethodError: com.nhn.user.UserAdmin.addUser(Ljava/lang/String;)V</div><p></p><p><i>NoSuchMethodError</i> has occurred since the "<i>com.nhn.user.UserAdmin.addUser(Ljava/lang/String;)V</i>" method could not be found. Take a look at "Ljava/lang/String;" and the last "V". In the expression of Java Bytecode, <i>"L&lt;classname&gt;;" </i>is the class instance. This means that the addUser() method returns one java/lang/String object as a parameter. In the library of this case, the parameter has not been changed, so it is normal. The last <i>"V"</i> of the message stands for the return value of the method. In the expression of Java Bytecode, "V" means that it has no return value. In short, the error message means that one java.lang.String object has been returned as a parameter and the com.nhn.user.UserAdmin.addUser method without any return value has not been found.</p><p>Since the application code has been compiled to the previous library, the class file defined that a method that returns "V" should be invoked. However, in the changed library, the method that returned "V" did not exist, but the method that returned "Lcom/nhn/user/User;" has been added. Therefore, a NoSuchMethodError occurred.</p><blockquote class="q4"><p><b>Note</b></p><p>The error has occurred since the developer did not compile a new library again. However, in this case, the library provider is mostly responsible for that. There was no return value of the method as public, but it later has been changed to return the user class instance. This is an obvious method signature change. This means that the backward compatibility of the library has been broken. Therefore, the library provider must have reported to the users that the method has been changed.</p></blockquote><p>Let's go back to the Java Bytecode. <b>Java Bytecode</b> is the essential element of JVM. The JVM is an emulator that emulates the Java Bytecode. Java compiler does not directly convert high-level language such as C/C++ to the machine language (direct CPU instruction); it converts the Java language that the developer understands to the Java Bytecode that the JVM understands. Since Java bytecode has no platform-dependent code, it is executable on the hardware where the JVM (accurately, the JRE of the same profile) has been installed, even when the CPU or OS is different (a class file developed and compiled on the Windows PC can be executed on the Linux machine without additional change.) The size of the compiled code is almost identical to the size of the source code, making it easy to transfer and execute the compiled code via &nbsp;the network.</p><p>The class file itself is a binary file that cannot be understood by a human. To manage this file, JVM vendors provide <b>javap</b>, the disassembler. The result of using javap is called Java assembly. In the above case, the Java assembly below is obtained by disassembling the UserService.add() method of the application code with the javap -c option.</p><p></p><div editor_component="code_highlighter" code_type="Java" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(/modules/editor/components/code_highlighter/code.png) no-repeat top right;"><p>public void add(java.lang.String);<br />&nbsp; Code:<br />&nbsp; &nbsp;0: &nbsp; aload_0<br />&nbsp; &nbsp;1: &nbsp; getfield &nbsp; &nbsp; &nbsp; &nbsp;#15; //Field admin:Lcom/nhn/user/UserAdmin;<br />&nbsp; &nbsp;4: &nbsp; aload_1<br />&nbsp; &nbsp;5: &nbsp; invokevirtual &nbsp; #23; //Method com/nhn/user/UserAdmin.addUser:(Ljava/lang/String;)V<br />&nbsp; &nbsp;8: &nbsp; return</p></div><p></p><p>In this Java assembly, the addUser() method is invoked by the fourth row, "5: invokevirtual #23;". This means that the method corresponding to the 23rd index should be invoked. The method of the 23rd index is annotated by the javap program. The <b>invokevirtual</b> is the OpCode (operation code) of the most basic command that invokes a method in the Java Bytecode. For reference, there are four OpCodes that invoke a method in the Java Bytecode: <i>invokeinterface, invokespecial, invokestatic</i>, and <i>invokevirtual</i>. The meaning of each OpCode is as follows.</p><p></p><ul><li><b>invokeinterface</b>: Invokes an interface method</li><li><b>invokespecial</b>: Invokes an initializer, private method, or superclass method</li><li><b>invokestatic</b>: Invokes static methods</li><li><b>invokevirtual</b>: Invokes instance methods</li></ul><p></p><p>The instruction set of Java Bytecode consists of OpCode and Operand. The OpCode such as invokevirtual requires a 2-byte Operand.</p><p>By compiling the application code above with the updated library and then disassembling it, the following result will be obtained.</p><p></p><div editor_component="code_highlighter" code_type="Java" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(/modules/editor/components/code_highlighter/code.png) no-repeat top right;"><p>public void add(java.lang.String);<br />&nbsp; Code:<br />&nbsp; &nbsp;0: &nbsp; aload_0<br />&nbsp; &nbsp;1: &nbsp; getfield &nbsp; &nbsp; &nbsp; &nbsp;#15; //Field admin:Lcom/nhn/user/UserAdmin;<br />&nbsp; &nbsp;4: &nbsp; aload_1<br />&nbsp; &nbsp;5: &nbsp; invokevirtual &nbsp; #23; //Method com/nhn/user/UserAdmin.addUser:(Ljava/lang/String;)Lcom/nhn/user/User;<br />&nbsp; &nbsp;8: &nbsp; pop<br />&nbsp; &nbsp;9: &nbsp; return</p></div><p></p><p></p><p>You can see that the method corresponding to the 23rd has been converted to the method that returns "Lcom/nhn/user/User;".</p><blockquote class="q2"><p><b>In the disassembled result above, what does the number in front of the code mean?</b></p></blockquote><p>It is the byte number. Perhaps this is the reason why the code executed by the JVM is called Java "Byte"code. In short, the bytecode instruction OpCodes such as <i>aload_0</i>, <i>getfield</i>, and <i>invokevirtual</i> are expressed as a 1-byte byte number. (aload_0 = 0x2a, getfield = 0xb4, invokevirtual = 0xb6) Therefore, the maximum number of Java Bytecode instruction OpCodes is 256.</p><p>OpCodes such as aload_0 and aload_1 do not need any Operand. Therefore, the next byte of aload_0 is the OpCode of the next instruction. However, getfield and invokevirtual need the 2-byte Operand. Therefore, the next instruction of getfield on the first byte is written on the fourth byte by skipping two bytes. The bytecode shown through Hex Editor is as follows.</p><p></p><div editor_component="code_highlighter" code_type="Java" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(/modules/editor/components/code_highlighter/code.png) no-repeat top right;">2a b4 00 0f 2b b6 00 17 57 b1</div><p></p><p>In the Java Bytecode, the class instance is expressed as "L;" and void is expressed as "V". In this way, other types have their own expressions. The table below summarizes the expressions.</p>

<h4>Table 1: Type Expression in Java Bytecode</h4>

<table>
<thead>
<tr>
	<td>Java Bytecode</td>
	<td>Type</td>
	<td>Description</td>
</tr>
</thead>
<tbody>
<tr>
	<td>B</td>
	<td>byte</td>
	<td>signed byte</td>
</tr>
<tr>
	<td>C</td>
	<td>char</td>
	<td>Unicode character</td>
</tr>
<tr>
	<td>D</td>
	<td>double</td>
	<td>double-precision floating-point value</td>
</tr>
<tr>
	<td>F</td>
	<td>float</td>
	<td>single-precision floating-point value</td>
</tr>
<tr>
	<td>I</td>
	<td>int</td>
	<td>integer</td>
</tr>
<tr>
	<td>J</td>
	<td>long</td>
	<td>long integer</td>
</tr>
<tr>
	<td>L&lt;classname&gt;</td>
	<td>reference</td>
	<td>an instance of class &lt;classname&gt;</td>
</tr>
<tr>
	<td>S</td>
	<td>short</td>
	<td>signed short</td>
</tr>
<tr>
	<td>Z</td>
	<td>boolean</td>
	<td>true or false</td>
</tr>
<tr>
	<td>[</td>
	<td>reference</td>
	<td>one array dimension</td>
</tr>
</tbody>
</table>

<p>The table below shows examples of Java Bytecode expressions.</p>


<h4>Table 2: Examples of Java Bytecode Expressions</h4>

<table>
<thead>
<tr>
	<td>Java Code</td>
	<td>Java Bytecode Expression</td>
</tr>
</thead>
<tbody>
<tr>
	<td>double d[][][];</td>
	<td>[[[D</td>
</tr>
<tr>
	<td>Object mymethod(int I, double d, Thread t)</td>
	<td>(IDLjava/lang/Thread;)Ljava/lang/Object;</td>
</tr>
</tbody>
</table>

<p>For more details, see "4.3 Descriptors" in "<i>The Java Virtual Machine Specification, Second Edition</i>". For various Java Bytecode instruction sets, see "6. The Java Virtual Machine Instruction Set" in "The Java Virtual Machine Specification, Second Edition".</p><h2>Class File Format</h2><p>Before explaining the Java class file format, let's review an example that frequently occurs in Java Web applications.</p><h3>Symptom</h3><p>When writing and executing JSP on Tomcat, the JSP did not run, and the following error occurred.</p><p></p><div editor_component="code_highlighter" code_type="Java" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(/modules/editor/components/code_highlighter/code.png) no-repeat top right;"><p>Servlet.service() for servlet jsp threw exception org.apache.jasper.JasperException: Unable to compile class for JSP Generated servlet error:<br />The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit"</p></div><p></p><p></p><h3>Reasons</h3><p>The error message above varies slightly depending on the Web application server, however, one thing is the same; it is because of the 65535 byte limit. The 65535 byte limit is one of the JVM limitations, and stipulates that the <b>size of one method cannot be more than 65535 bytes</b>.</p><p>I will present the meaning of the 65535 byte limit and why it has been set in more detailed manner.</p><p>The branch/jump instructions used in the Java Bytecode are "goto" and "jsr".</p><p></p><div editor_component="code_highlighter" code_type="Java" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(/modules/editor/components/code_highlighter/code.png) no-repeat top right;"><p>goto [branchbyte1] [branchbyte2]<br />jsr [branchbyte1] [branchbyte2]</p></div><p></p><p></p><p>Both of the two receive 2-byte signed branch offset as their Operand so that they can be expanded to the 65535th index at a maximum. However, to support more sufficient branch, Java Bytecode prepares "goto_w" and "jsr_w" that receive 4-byte signed branch offset.</p><p></p><div editor_component="code_highlighter" code_type="Java" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(/modules/editor/components/code_highlighter/code.png) no-repeat top right;">goto_w [branchbyte1] [branchbyte2] [branchbyte3] [branchbyte4]<br />jsr_w [branchbyte1] [branchbyte2] [branchbyte3] [branchbyte4]</div><p></p><p>With the two, branch is available with an index exceeding 65535. Therefore, the 65535 byte limit of Java method may be overcome. However, due to various other limits of the Java class file format, the Java method still cannot exceed 65535 bytes. To view other limits, I will simply explain the class file format.</p><p>The outline of a Java class file is as follows:&nbsp;</p><p></p><div editor_component="code_highlighter" code_type="Java" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(/modules/editor/components/code_highlighter/code.png) no-repeat top right;"><p>ClassFile {<br />&nbsp; &nbsp; u4 magic;<br />&nbsp; &nbsp; u2 minor_version;<br />&nbsp; &nbsp; u2 major_version;<br />&nbsp; &nbsp; u2 constant_pool_count;<br />&nbsp; &nbsp; cp_info constant_pool[constant_pool_count-1];<br />&nbsp; &nbsp; u2 access_flags;<br />&nbsp; &nbsp; u2 this_class;<br />&nbsp; &nbsp; u2 super_class;<br />&nbsp; &nbsp; u2 interfaces_count;<br />&nbsp; &nbsp; u2 interfaces[interfaces_count];<br />&nbsp; &nbsp; u2 fields_count;<br />&nbsp; &nbsp; field_info fields[fields_count];<br />&nbsp; &nbsp; u2 methods_count;<br />&nbsp; &nbsp; method_info methods[methods_count];<br />&nbsp; &nbsp; u2 attributes_count;<br />&nbsp; &nbsp; attribute_info attributes[attributes_count];</p><p>}</p></div><p></p><p></p><p>The above is included in "4.1. The ClassFile Structure" of "The Java Virtual Machine Specification, Second Edition".</p><p>The first 16 bytes of the UserService.class file disassembled earlier are shown as follows in the Hex Editor.</p><p>ca fe ba be 00 00 00 32 00 28 07 00 02 01 00 1b</p><p>With this value, see the class file format.</p><p></p><ul><li><b>magic</b>: The first 4 bytes of the class file are the magic number. This is a pre-specified value to distinguish the Java class file. As shown in the Hex Editor above, the value is always 0xCAFEBABE. In short, when the first 4 bytes of a file is 0xCAFEBABE, it can be regarded as the Java class file. This is a kind of "witty" magic number related to the name "Java".</li><li><b>minor_version, major_version</b>: The next 4 bytes indicate the class version. As the UserService.class file is 0x00000032, the class version is 50.0. The version of a class file compiled by JDK 1.6 is 50.0, and the version of a class file compiled by JDK 1.5 is 49.0. The JVM must maintain backward compatibility with class files compiled in a lower version than itself. On the other hand, when a upper-version class file is executed in the lower-version JVM, java.lang.UnsupportedClassVersionError occurs.</li><li><b>constant_pool_count, constant_pool[]</b>: Next to the version, the class-type constant pool information is described. This is the information included in the Runtime Constant Pool area, which will be explained later. While loading the class file, the JVM includes the constant_pool information in the Runtime Constant Pool area of the method area. As the constant_pool_count of the UserService.class file is 0x0028, you can see that the constant_pool has (40-1) indexes, 39 indexes.</li><li><b>access_flags</b>: This is the flag that shows the modifier information of a class; in other words, it shows public, final, abstract or whether or not to interface.</li><li><b>this_class, super_class</b>: The index in the constant_pool for the class corresponding to this and super, respectively.</li><li><b>interfaces_count, interfaces[]</b>: The index in the the constant_pool for the number of interfaces implemented by the class and each interface.</li><li><b>fields_count, fields[]</b>: The number of fields and the field information of the class. The field information includes the field name, type information, modifier, and index in the constant_pool.</li><li><b>methods_count, methods[]</b>: The number of methods in a class and the methods information of the class. The methods information includes the methods name, type and number of the parameters, return type, modifier, index in the constant_pool, execution code of the method, and exception information.</li><li><b>attributes_count, attributes[]</b>: The attribute_info structure has various attributes. For field_info or method_info, attribute_info is used.</li></ul><p></p><p>The javap program briefly shows the class file format in a format that users can read. When UserService.class is analyzed using the "javap -verbose" option, the following contents are printed.</p><p></p><div editor_component="code_highlighter" code_type="Java" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(/modules/editor/components/code_highlighter/code.png) no-repeat top right;"><p>Compiled from "UserService.java"<br /><br />public class com.nhn.service.UserService extends java.lang.Object<br />&nbsp; SourceFile: "UserService.java"<br />&nbsp; minor version: 0<br />&nbsp; major version: 50<br />&nbsp; Constant pool:</p><p>const #1 = class &nbsp; &nbsp; &nbsp; &nbsp;#2; &nbsp; &nbsp; // &nbsp;com/nhn/service/UserService<br />const #2 = Asciz &nbsp; &nbsp; &nbsp; &nbsp;com/nhn/service/UserService;<br />const #3 = class &nbsp; &nbsp; &nbsp; &nbsp;#4; &nbsp; &nbsp; // &nbsp;java/lang/Object<br />const #4 = Asciz &nbsp; &nbsp; &nbsp; &nbsp;java/lang/Object;<br />const #5 = Asciz &nbsp; &nbsp; &nbsp; &nbsp;admin;<br />const #6 = Asciz &nbsp; &nbsp; &nbsp; &nbsp;Lcom/nhn/user/UserAdmin;;</p><p>// … omitted - constant pool continued …<br /><br />{<br />// … omitted - method information …<br /><br />public void add(java.lang.String);<br />&nbsp; Code:<br />&nbsp; &nbsp;Stack=2, Locals=2, Args_size=2<br />&nbsp; &nbsp;0: &nbsp; aload_0<br />&nbsp; &nbsp;1: &nbsp; getfield &nbsp; &nbsp; &nbsp; &nbsp;#15; //Field admin:Lcom/nhn/user/UserAdmin;<br />&nbsp; &nbsp;4: &nbsp; aload_1<br />&nbsp; &nbsp;5: &nbsp; invokevirtual &nbsp; #23; //Method com/nhn/user/UserAdmin.addUser:(Ljava/lang/String;)Lcom/nhn/user/User;<br />&nbsp; &nbsp;8: &nbsp; pop<br />&nbsp; &nbsp;9: &nbsp; return</p><p>&nbsp; LineNumberTable:<br />&nbsp; &nbsp;line 14: 0<br />&nbsp; &nbsp;line 15: 9</p><p>&nbsp; LocalVariableTable:<br />&nbsp; &nbsp;Start &nbsp;Length &nbsp;Slot &nbsp;Name &nbsp; Signature<br />&nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp;10 &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp;this &nbsp; &nbsp; &nbsp; Lcom/nhn/service/UserService;<br />&nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp;10 &nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp;userName &nbsp; &nbsp; &nbsp; Ljava/lang/String;&nbsp;</p><p>// … Omitted - Other method information …<br />}</p></div><p></p><p></p><p>Due to a lack of space, I have extracted some parts from the entire printout. The entire printout shows you the various information included in the constant pool and the contents of each method.</p><p>The 65535 byte limit of method size is related to the contents of <b>method_info struct</b>. The method_info struct has Code, LineNumberTable, and LocalVariableTable attribute, as shown in the "javap -verbose" print shown above. All of the values corresponding to the length of LineNumberTable, LocalVariableTable, and exception_table included in the Code attribute are fixed at 2 bytes. Therefore, the method size cannot exceed the length of LineNumberTable, LocalVariableTable, and exception_table, and is limited to 65535 bytes.</p><p>Many people have complaints about the method size limit, and the JVM specifications state that 'it may be expandable later.’ However, no explicit move toward improvement has been made so far. Considering the characteristic of JVM specifications that loads almost same contents in the class file to the method area, it will be significantly difficult to expand the method size while maintining backward compatibility.</p><blockquote class="q2"><p><b>What will happen if an incorrect class file is created because of a Java compiler error? Or, what if due to errors in network transfer or file copy process, a class file can be broken?</b></p></blockquote><p>To prepare for such cases, the Java class loader is verified through a very strict and tight process. The JVM specifications explicitly detail the process.</p><blockquote class="q4"><p><b>Note</b></p><p>How can we verify that the JVM successfully executes the class file verification process? How can we verify that various JVMs from various JVM vendors satisfy the JVM specifications? For verification, Oracle provides a test tool, TCK (Technology Compatibility Kit). The TCK verifies a JVM specification by executing ten thousands of tests, including a many incorrect class files in various ways. After passing the TCK, the JVM can be called a JVM.&nbsp;</p><p>Like TCK, there is JCP (Java Community Process; http://jcp.org), which proposes new Java technical specifications as well as Java specifications. For the JCP, a specification document, reference implementation, and TCK for a proposed JSR (Java Specification Request) must be completed to complete JSR. Users who want to use new Java technology proposed as JSR should license the implementation from the RI provider, or directly implement it and test the implementation with TCK.</p></blockquote><h2>JVM Structure</h2><p>The code written in Java is executed by following the process shown in the figure below.&nbsp;</p><p style="text-align: center;">&nbsp;<img src="/files/attach/images/220547/468/290/java-code-execution-process.png" alt="java-code-execution-process.png" width="353" height="383" editor_component="image_link" />
</p><p style="text-align: center;"><b>Figure 1: Java Code Execution Process.</b></p><p>A class loader loads the compiled Java Bytecode to the Runtime Data Areas, and the execution engine executes the Java Bytecode.</p><h3>Class Loader</h3><p>Java provides a dynamic load feature; it loads and links the class when it refers to a class for the first time at runtime, not compile time. JVM's class loader executes the dynamic load. The features of Java class loader are as follows:</p><p></p><ul><li><b>Hierarchical Structure</b>: Class loaders in Java are organized into a hierarchy with a parent-child relationship. The Bootstrap Class Loader is the parent of all class loaders.</li><li><b>Delegation mode</b>: Based on the hierarchical structure, load is delegated between class loaders. When a class is loaded, the parent class loader is checked to determine whether or not the class is in the parent class loader. If the upper class loader has the class, the class is used. If not, the class loader requested for loading loads the class.</li><li><b>Visibility limit</b>: A child class loader can find the class in the parent class loader; however, a parent class loader can find the class in the child class loader.</li><li><b>Unload is not allowed</b>: A class loader can load a class but cannot unload it. Instead of unloading, the current class loader can be deleted, and a new class loader can be created.</li></ul><p></p><p>Each class loader has its namespace that stores the loaded classes. When a class loader loads a class, it searches the class based on FQCN (Fully Qualified Class Name) stored in the namespace to check whether or not the class has been already loaded. Even if the class has an identical FQCN but a different namespace, it is regarded as a different class. A different namespace means that the class has been loaded by another class loader.</p><p>The following figure illustrates the class loader delegation model.</p><p style="text-align: center;">&nbsp;<img src="/files/attach/images/220547/468/290/class-loader-delegation-model.png" alt="class-loader-delegation-model.png" width="409" height="455" editor_component="image_link" />
</p><p style="text-align: center;"><b>Figure 2: Class Loader Delegation Model.</b></p><p>When a class loader is requested for class load, it checks whether or not the class exists in the class loader cache, the parent class loader, and itself, in the order listed. In short, it checks whether or not the class has been loaded in the class loader cache. If not, it checks the parent class loader. If the class is not found in the bootstrap class loader, the requested class loader searches for the class in the file system.</p><p></p><ul><li><b>Bootstrap class loader</b>: This is created when running the JVM. It loads Java APIs, including object classes. Unlike other class loaders, it is implemented in native code instead of Java.</li><li><b>Extension class loader</b>: It loads the extension classes excluding the basic Java APIs. It also loads various security extension functions.</li><li><b>System class loader</b>: If the bootstrap class loader and the extension class loader load the JVM components, the system class loader loads the application classes. It loads the class in the $CLASSPATH specified by the user.</li><li><b>User-defined class loader</b>: This is a class loader that an application user directly creates on the code.</li></ul><p></p><p>Frameworks such as Web application server (WAS) use it to make Web applications and enterprise applications run independently. In other words, this guarantees the independence of applications through class loader delegation model. Such a WAS class loader structure uses a hierarchical structure that is slightly different for each WAS vendor.</p><p>If a class loader finds an unloaded class, the class is loaded and linked by following the process illustrated below.</p><p style="text-align: center;">&nbsp;<img src="/files/attach/images/220547/468/290/class-load-stage.png" alt="class-load-stage.png" width="701" height="340" editor_component="image_link" />
</p><p style="text-align: center;"><b>Figure 3: Class Load Stage.</b></p><p>Each stage is described as follows.</p><p></p><ul><li><b>Loading</b>: A class is obtained from a file and loaded to the JVM memory.</li><li><b>Verifying</b>: Check whether or not the read class is configured as described in the Java Language Specification and JVM specifications. This is the most complicated test process of the class load processes, and takes the longest time. Most cases of the JVM TCK test cases are to test whether or not a verification error occurs by loading wrong classes.</li><li><b>Preparing</b>: Prepare a data structure that assigns the memory required by classes and indicates the fields, methods, and interfaces defined in the class.</li><li><b>Resolving</b>: Change all symbolic references in the constant pool of the class to direct references.</li><li><b>Initializing</b>: Initialize the class variables to proper values. Execute the static initializers and initialize the static fields to the configured values.</li></ul><p></p><p>The JVM specification defines the tasks. However, it allows flexible application of the execution time.</p><h3>Runtime Data Areas</h3><p style="text-align: center;">&nbsp;<img src="/files/attach/images/220547/468/290/runtime-data-access-configuration.png" alt="runtime-data-access-configuration.png" width="365" height="423" editor_component="image_link" />
</p><p style="text-align: center;"><b>Figure 4: Runtime Data Areas Configuration.</b></p><p>Runtime Data Areas are the memory areas assigned when the JVM program runs on the OS. The runtime data areas can be divided into 6 areas. Of the six, one PC Register, JVM Stack, and Native Method Stack are created for one thread. Heap, Method Area, and Runtime Constant Pool are shared by all threads.</p><p></p><ul><li><b>PC register</b>: One PC (Program Counter) register exists for one thread, and is created when the thread starts. PC register has the address of a JVM instruction being executed now.</li><li><b>JVM stack</b>: One JVM stack exists for one thread, and is created when the thread starts. It is a stack that saves the struct (Stack Frame). The JVM just pushes or pops the stack frame to the JVM stack. If any exception occurs, each line of the stack trace shown as a method such as printStackTrace() expresses one stack frame.</li></ul><p></p><p style="text-align: center;">&nbsp;<img src="/files/attach/images/220547/468/290/jvm-stack-configuration.png" alt="jvm-stack-configuration.png" width="377" height="272" editor_component="image_link" />
</p><p style="text-align: center;"><b>Figure 5: JVM Stack Configuration.</b></p><p>−<span class="Apple-tab-span" style="white-space:pre">	</span>Stack frame: One stack frame is created whenever a method is executed in the JVM, and the stack frame is added to the JVM stack of the thread. When the method is ended, the stack frame is removed. Each stack frame has the reference for local variable array, Operand stack, and runtime constant pool of a class where the method being executed belongs. The size of local variable array and Operand stack is determined while compiling. Therefore, the size of stack frame is fixed according to the method.</p><p>−<span class="Apple-tab-span" style="white-space:pre">	</span>Local variable array: It has an index starting from 0. 0 is the reference of a class instance where the method belongs. From 1, the parameters sent to the method are saved. After the method parameters, the local variables of the method are saved.</p><p>−<span class="Apple-tab-span" style="white-space:pre">	</span>Operand stack: An actual workspace of a method. Each method exchanges data between the Operand stack and the local variable array, and pushes or pops other method invoke results. The necessary size of the Operand stack space can be determined during compiling. Therefore, the size of the Operand stack can also be determined during compiling.</p><p></p><ul><li><b>Native method stack</b>: A stack for native code written in a language other than Java. In other words, it is a stack used to execute C/C++ codes invoked through JNI (Java Native Interface). According to the language, a C stack or C++ stack is created.</li><li><b>Method area</b>: The method area is shared by all threads, created when the JVM starts. It stores runtime constant pool, field and method information, static variable, and method bytecode for each of the classes and interfaces read by the JVM. The method area can be implemented in various formats by JVM vendor. Oracle Hotspot JVM calls it Permanent Area or Permanent Generation (PermGen). The garbage collection for the method area is optional for each JVM vendor.</li><li><b>Runtime constant pool</b>: An area that corresponds to the constant_pool table in the class file format. This area is included in the method area; however, it plays the most core role in JVM operation. Therefore, the JVM specification separately describes its importance. As well as the constant of each class and interface, it contains all references for methods and fields. In short, when a method or field is referred to, the JVM searches the actual address of the method or field on the memory by using the runtime constant pool.</li><li><b>Heap</b>: A space that stores instances or objects, and is a target of garbage collection. This space is most frequently mentioned when discussing issues such as JVM performance. JVM vendors can determine how to configure the heap or not to collect garbage.</li></ul><p></p><p>Let's go back to the disassembled bytecode we discussed previously.&nbsp;</p><p></p><div editor_component="code_highlighter" code_type="Java" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(/modules/editor/components/code_highlighter/code.png) no-repeat top right;"><p>public void add(java.lang.String);<br />&nbsp; Code:<br />&nbsp; &nbsp;0: &nbsp; aload_0<br />&nbsp; &nbsp;1: &nbsp; getfield &nbsp; &nbsp; &nbsp; &nbsp;#15; //Field admin:Lcom/nhn/user/UserAdmin;<br />&nbsp; &nbsp;4: &nbsp; aload_1<br />&nbsp; &nbsp;5: &nbsp; invokevirtual &nbsp; #23; //Method com/nhn/user/UserAdmin.addUser:(Ljava/lang/String;)Lcom/nhn/user/User;<br />&nbsp; &nbsp;8: &nbsp; pop<br />&nbsp; &nbsp;9: &nbsp; return</p></div><p></p><p></p><p>Comparing the disassembled code and the assembly code of the x86 architecture that we sometimes see, the two have a similar format, OpCode; however, there is a difference in that Java Bytecode does not write register name, memory addressor, or offset on the Operand. As described before, the JVM uses stack. Therefore, it does not use register, unlike the x86 architecture that uses registers, and it uses index numbers such as 15 and 23 instead of memory addresses since it manages the memory by itself. The 15 and 23 are the indexes of the constant pool of the current class (here, UserService class). In short, the JVM creates a constant pool for each class, and the pool stores the reference of the actual target.</p><p>Each row of the disassembled code is interpreted as follows.</p><p></p><ul><li><b>aload_0</b>: Add the #0 index of the local variable array to the Operand stack. The #0 index of the local variable array is always this, the reference for the current class instance.</li><li><b>getfield #15</b>: In the current class constant pool, add the #15 index to the Operand stack. UserAdmin admin field is added. Since the admin field is a class instance, a reference is added.</li><li><b>aload_1</b>: Add the #1 index of the local variable array to the Operand stack. From the #1 index of the local variable array, it is a method parameter. Therefore, the reference of String userName sent while invoking add() is added.</li><li><b>invokevirtual #23</b>: Invoke the method corresponding to the #23 index in the current class constant pool. At this time, the reference added by using getfield and the parameter added by using aload_1 are sent to the method to invoke. When the method invocation is completed, add the return value to the Operand stack.</li><li><b>pop</b>: Pop the return value of invoking by using invokevirtual from the Operand stack. You can see that the code compiled by the previous library has no return value. In short, the previous has no return value, so there was no need to pop the return value from the stack.</li><li><b>return</b>: Complete the method.</li></ul><p></p><p>The following figure will help you understand the explanation.</p><p style="text-align: center;"><img src="/files/attach/images/220547/468/290/example-of-java-bytecode-loaded-on-runtime-data-areas.png" alt="example-of-java-bytecode-loaded-on-runtime-data-areas.png" width="401" height="520" editor_component="image_link" /><br /></p><p style="text-align: center;"><b>Figure 6: Example of Java Bytecode Loaded on Runtime Data Areas.</b></p><p>For reference, in this method, no local variable array has been changed. So the figure above displays the changes in Operand stack only. However, in most cases, local variable array is also changed. Data transfer between the local variable array and the Operand stack is made by using a lot of load instructions (aload, iload) and store instructions (astore, istore).&nbsp;</p><p>In this figure, we have checked the brief description of the runtime constant pool and the JVM stack. When the JVM runs, each class instance will be assigned to the heap, and class information including User, UserAdmin, UserService, and String will be stored in the method area.</p><h3>Execution Engine</h3><p>The bytecode that is assigned to the runtime data areas in the JVM via class loader is executed by the execution engine. The execution engine reads the Java Bytecode in the unit of instruction. It is like a CPU executing the machine command one by one. Each command of the bytecode consists of a 1-byte OpCode and additional Operand. The execution engine gets one OpCode and execute task with the Operand, and then executes the next OpCode.</p><p>But the Java Bytecode is written in a language that a human can understand, rather than in the language that the machine directly executes. Therefore, the execution engine must change the bytecode to the language that can be executed by the machine in the JVM. The bytecode can be changed to the suitable language in one of two ways.</p><p></p><ul><li><b>Interpreter</b>: Reads, interprets and executes the bytecode instructions one by one. As it interprets and executes instructions one by one, it can quickly interpret one bytecode, but slowly executes the interpreted result. This is the disadvantage of the interpret language. The 'language' called Bytecode basically runs like an interpreter.</li><li><b>JIT (Just-In-Time) compiler</b>: The JIT compiler has been introduced to compensate for the disadvantages of the interpreter. The execution engine runs as an interpreter first, and at the appropriate time, the JIT compiler compiles the entire bytecode to change it to native code. After that, the execution engine no longer interprets the method, but directly executes using native code. Execution in native code is much faster than interpreting instructions one by one. The compiled code can be executed quickly since the native code is stored in the cache.&nbsp;</li></ul><p></p><p>However, it takes more time for JIT compiler to compile the code than for the interpreter to interpret the code one by one. Therefore, if the code is to be executed just once, it is better to interpret it instead of compiling. Therefore, the JVMs that use the JIT compiler internally check how frequently the method is executed and compile the method only when the frequency is higher than a certain level.</p><p style="text-align: center;">&nbsp;<img src="/files/attach/images/220547/468/290/java-compiler-and-jit-compiler.png" alt="java-compiler-and-jit-compiler.png" width="400" height="173" editor_component="image_link" />
</p><p style="text-align: center;"><b>Figure 7: Java Compiler and JIT Compiler.</b></p><p>How the execution engine runs is not defined in the JVM specifications. Therefore, JVM vendors improve their execution engines using various techniques, and introduce various types of JIT compilers.&nbsp;</p><p>Most JIT compilers run as shown in the figure below:&nbsp;</p><p style="text-align: center;">&nbsp;<img src="/files/attach/images/220547/468/290/jit-compiler.png" alt="jit-compiler.png" width="400" height="233" editor_component="image_link" />
</p><p style="text-align: center;"><b>Figure 8: JIT Compiler.</b></p><p>The JIT compiler converts the bytecode to an intermediate-level expression, IR (Intermediate Representation), to execute optimization, and then converts the expression to native code.</p><p>Oracle Hotspot VM uses a JIT compiler called Hotspot Compiler. It is called Hotspot because Hotspot Compiler searches the 'Hotspot' that requires compiling with the highest priority through profiling, and then it compiles the hotspot to native code. If the method that has the bytecode compiled is no longer frequently invoked, in other words, if the method is not the hotspot any more, the Hotspot VM removes the native code from the cache and runs in interpreter mode. The Hotspot VM is divided into the Server VM and the Client VM, and the two VMs use different JIT compilers.</p><p style="text-align: center;"><img src="/files/attach/images/220547/468/290/hotspot-client-vm-and-server-vm.png" alt="hotspot-client-vm-and-server-vm.png" width="400" height="180" editor_component="image_link" />&nbsp;</p><p style="text-align: center;"><b>Figure 9: Hotspot Client VM and Server VM.</b></p><p>The client VM and the server VM use an identical runtime; however, they use different JIT compilers, as shown in the above figure. The client VM and the server VM use an identical runtime, however, they use different JIT compilers as shown in the above figure. Advanced Dynamic Optimizing Compiler used by the server VM uses more complex and diverse performance optimization techniques.</p><p>IBM JVM has introduced AOT (Ahead-Of-Time) Compiler from IBM JDK 6 as well as the JIT compiler. This means that many JVMs share the native code compiled through the shared cache. In short, the code that has been already compiled through the AOT compiler can be used by another JVM without compiling. In addition, IBM JVM provides a fast way of execution by pre-compiling code to JXE (Java EXecutable) file format using the AOT compiler.</p><p>Most Java performance improvement is accomplished by improving the execution engine. As well as the JIT compiler, various optimization techniques are being introduced so the JVM performance can be continuously improved. The biggest difference between the initial JVM and the latest JVM is the execution engine.</p><p>Hotspot compiler has been introduced to Oracle Hotspot VM from version 1.3, and JIT compiler has been introduced to Dalvik VM from Android 2.2.</p><blockquote class="q4"><p><b>Note</b></p><p>The technique in which an intermediate language such as bytecode is introduced, the VM executes the bytecode, and the JIT compiler improves the performance of JVM is also commonly used in other languages that have introduced intermediate languages. For Microsoft's .Net, CLR (Common Language Runtime), a kind of VM, executes a kind of bytecode, called CIL (Common Intermediate Language). CLR provides the AOT compiler as well as the JIT compiler. Therefore, if source code is written in C# or VB.NET and compiled, the compiler creates CIL and the CIL is executed on the CLR with the JIT compiler. The CLR uses the garbage collection and runs as a stack machine like the JVM.</p></blockquote><h2>The Java Virtual Machine Specification, Java SE 7 Edition</h2><p>On 28th July, 2011, Oracle released Java SE 7 and updated the JVM specifications to Java SE 7 version. After releasing "The Java Virtual Machine Specification, Second Edition" in 1999, it took 12 years for Oracle to release the updated version. The updated version includes various changes and modifications accumulated over 12 years, and describes more clear specifications. In addition, it reflects the contents included in "The Java Language Specification, Java SE 7 Edition" released with Java SE 7. The major changes can be summarized as follows:</p><p></p><ul><li>Generics introduced from Java SE 5.0, supporting variable argument method</li><li>Bytecode verification process technique changed since Java SE 6</li><li>Added invokedynamic instruction and related class file formats for supporting dynamic type languages</li><li>Deleted the description of the concept of the Java language itself and referred reader to the Java language specifications</li><li>Deleted the description on Java Thread and Lock, and transferred these to the Java language specifications</li></ul><p></p><p>The biggest change of these is the addition of invokedynamic instruction. This means that a change was made in the JVM internal instruction sets, as the JVM started to support dynamic type languages of which type is not fixed, such as script languages, as well as Java language from Java SE 7. The OpCode 186 which had not been used previously has been assigned to the new instruction, invokedynamic, and new contents have been added to the class file format to support the invokedynamic.</p><p>The version of the class file created by the Java compiler of Java SE 7 is 51.0. The version of Java SE 6 is 50.0. Much of the class file format has been changed. Therefore, class files with version 51.0 cannot be executed in the Java SE 6 JVM.&nbsp;</p><p>Despite these various changes, the 65535 byte limit of the Java method has not been removed. Unless the JVM class file format is innovatively changed, it may not be removed in the future.</p><p>For reference, Oracle Java SE 7 VM supports G1, the new garbage collection; however, it is limited to the Oracle JVM, so JVM itself does not limit any garbage collection type. Therefore, the JVM specifications do not describe that.</p><h3>String in switch Statements</h3><p>Java SE 7 adds various grammars and features. However, compared to the various changes in language of Java SE 7, there are not so many changes in the JVM. So, how can the new features of the Java SE 7 be implemented? We will see how String in switch Statements (a function to add a string to a switch() statement as a comparison) has been implemented in Java SE 7 by disassembling it.</p><p>For example, the following code has been written.</p><p></p><div editor_component="code_highlighter" code_type="Java" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(/modules/editor/components/code_highlighter/code.png) no-repeat top right;"><p>// SwitchTest<br />public class SwitchTest {<br />&nbsp; &nbsp; public int doSwitch(String str) {<br />&nbsp; &nbsp; &nbsp; &nbsp; switch (str) {<br />&nbsp; &nbsp; &nbsp; &nbsp; case "abc": &nbsp; &nbsp; &nbsp; &nbsp;return 1;<br />&nbsp; &nbsp; &nbsp; &nbsp; case "123": &nbsp; &nbsp; &nbsp; &nbsp;return 2;<br />&nbsp; &nbsp; &nbsp; &nbsp; default: &nbsp; &nbsp; &nbsp; &nbsp; return 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />}</p></div><p></p><p></p><p>Since it is a new function of Java SE 7, it cannot be compiled using the Java compiler for Java SE 6 or lower versions. Compile it using the javac of Java SE 7. The following screen is the compiling result printed by using javap –c.</p><p></p><div editor_component="code_highlighter" code_type="Java" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url(/modules/editor/components/code_highlighter/code.png) no-repeat top right;"><p>C:Test&gt;javap -c SwitchTest.class</p><p>Compiled from "SwitchTest.java"<br />public class SwitchTest {<br />&nbsp; public SwitchTest();<br />&nbsp; &nbsp; Code:<br />&nbsp; &nbsp; &nbsp; &nbsp;0: aload_0<br />&nbsp; &nbsp; &nbsp; &nbsp;1: invokespecial #1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Method java/lang/Object."&lt;init&gt;":()V<br />&nbsp; &nbsp; &nbsp; &nbsp;4: return</p><p>&nbsp; public int doSwitch(java.lang.String);<br />&nbsp; &nbsp; Code:<br />&nbsp; &nbsp; &nbsp; &nbsp;0: aload_1<br />&nbsp; &nbsp; &nbsp; &nbsp;1: astore_2<br />&nbsp; &nbsp; &nbsp; &nbsp;2: iconst_m1<br />&nbsp; &nbsp; &nbsp; &nbsp;3: istore_3<br />&nbsp; &nbsp; &nbsp; &nbsp;4: aload_2<br />&nbsp; &nbsp; &nbsp; &nbsp;5: invokevirtual #2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Method java/lang/String.hashCode:()I<br />&nbsp; &nbsp; &nbsp; &nbsp;8: lookupswitch &nbsp;{ // 2<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;48690: 50<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;96354: 36<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;default: 61<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; 36: aload_2<br />&nbsp; &nbsp; &nbsp; 37: ldc &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// String abc<br />&nbsp; &nbsp; &nbsp; 39: invokevirtual #4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Method java/lang/String.equals:(Ljava/lang/Object;)Z<br />&nbsp; &nbsp; &nbsp; 42: ifeq &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;61<br />&nbsp; &nbsp; &nbsp; 45: iconst_0<br />&nbsp; &nbsp; &nbsp; 46: istore_3<br />&nbsp; &nbsp; &nbsp; 47: goto &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;61<br />&nbsp; &nbsp; &nbsp; 50: aload_2<br />&nbsp; &nbsp; &nbsp; 51: ldc &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// String 123<br />&nbsp; &nbsp; &nbsp; 53: invokevirtual #4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Method java/lang/String.equals:(Ljava/lang/Object;)Z<br />&nbsp; &nbsp; &nbsp; 56: ifeq &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;61<br />&nbsp; &nbsp; &nbsp; 59: iconst_1<br />&nbsp; &nbsp; &nbsp; 60: istore_3<br />&nbsp; &nbsp; &nbsp; 61: iload_3<br />&nbsp; &nbsp; &nbsp; 62: lookupswitch &nbsp;{ // 2<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0: 88<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1: 90<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;default: 92<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; 88: iconst_1<br />&nbsp; &nbsp; &nbsp; 89: ireturn<br />&nbsp; &nbsp; &nbsp; 90: iconst_2<br />&nbsp; &nbsp; &nbsp; 91: ireturn<br />&nbsp; &nbsp; &nbsp; 92: iconst_0<br />&nbsp; &nbsp; &nbsp; 93: ireturn</p></div><p></p><p></p><p>A significantly longer bytecode than the Java source code has been created. First, you can see that lookupswitch instruction has been used for switch() statement in Java bytecode. However, two lookupswitch instructions have been used, not the one lookupswitch instruction. When disassembling the case in which int has been added to switch() statement, only one lookupswitch instruction has been used. This means that the switch() statement has been divided into two statements to process the string. See the annotation of the #5, #39, and #53 byte instructions to see how the switch() statement has processed the string.</p><p>In the #5 and #8 byte, first, hashCode() method has been executed and switch(int) has been executed by using the result of executing hashCode() method. In the braces of the lookupswitch instruction, branch is made to the different location according to the hashCode result value. String "abc" is hashCode result value 96354, and is moved to #36 byte. String "123" is hashCode result value 48690, and is moved to #50 byte.</p><p>In the #36, #37, #39, and #42 bytes, you can see that the value of the str variable received as an argument is compared using the String "abc" and the equals() method. If the results are identical, '0' is inserted to the #3 index of the local variable array, and the string is moved to the #61 byte.</p><p>In this way, in the #50, #51, #53, and #56 bytes, you can see that the value of the str variable received as an argument is compared by using the String "123" and the equals() method. If the results are identical, '1' is inserted to the #3 index of the local variable array and the string is moved to the #61 byte.</p><p>In the #61 and #62 bytes, the value of the #3 index of the local variable array, i.e., '0', '1', or any other value, is lookupswitched and branched.</p><p>In other words, in Java code, the value of the str variable received as the switch() argument is compared using the hashCode() method and the equals() method. With the result int value, switch() is executed.</p><p>In this result, the compiled bytecode is not different from the previous JVM specifications. The new feature of Java SE 7, String in switch is processed by the Java compiler, not by the JVM itself. In this way, other new features of Java SE 7 will also be processed by the Java compiler.</p><h2>Conclusion</h2><p>I don't think that we need to review how Java has been developed to use Java well. So many Java developers develop great applications and libraries without understanding JVM deeply. However, if you understand JVM, you will understand Java more, and it will be helpful to solve the problems like the case we have reviewed here.</p><p>Besides the description mentioned here, the JVM has various features and technologies. The JVM specifications provide a flexible specification for JVM vendors to provide more advanced performance so that various technologies can be applied by the vendor. In particular, garbage collection is the technique used by most languages that provides usability similar to that of a VM, the latest and state-of-the-art technique in its performance. However, as this has been discussed in many more prominent studies, I did not explain it deeply in this article.</p><p>For Korean speakers, if you need more information on the internal structure of JVM, I recommend you to refer to "<b>Java Performance Fundamental</b>" (Hando Kim, Seoul, EXEM, 2009). The book is written in Korean so it is easy to read.&nbsp;I have referenced this book as well as the JVM specifications to write this article.&nbsp;For English speaking readers, there should be many books covering Java Performance topic.</p><p>By Se Hoon Park, Messaging Platform Development Team, NHN Corporation.</p><p></p>]]></description>
                        <pubDate>Tue, 07 Feb 2012 18:26:37 -0800</pubDate>
                        <category>JVM</category>
                        <category>Java</category>
                        <category>programming</category>
                        <category>VM</category>
                        <category>Virtual Machine</category>
                        <category>Java bytecode</category>
                        <category>Java Virtual Machine</category>
                                    <slash:comments>1</slash:comments>
                    </item>
        										        <item>
            <title>How to add alternative hosts to a connection string in ADO.NET?</title>
            <dc:creator>eye</dc:creator>
            <link>http://www.cubrid.org/questions/299585</link>
            <guid isPermaLink="true">http://www.cubrid.org/questions/299585</guid>
                                    <description><![CDATA[<p>In CUBRID it is possible to indicate alternative hosts (brokers) in the connection string as a measurement for broker fail-over. <a href="/manual/841/en/Connection%20Configuration" target="_self">JDBC manual</a> provides an example for this.</p><p>However, I could not find a way to pass alternative hosts to <a href="/wiki_apis/entry/connection-string" target="_self">ADO.NET connection string</a>. How can I do this?</p>]]></description>
                        <pubDate>Mon, 20 Feb 2012 21:14:57 -0800</pubDate>
                        <category>ADO.NET</category>
                        <category>connection string</category>
                        <category>broker</category>
                        <category>alternative host</category>
                                    <slash:comments>1</slash:comments>
                    </item>
        										        <item>
            <title>Using Solr / Lucene for full text search with CUBRID Database on Ubuntu</title>
            <dc:creator>CUBRID</dc:creator>
            <link>http://www.cubrid.org/wiki_tutorials/entry/using-solr-lucene-for-full-text-search-with-cubrid-database-on-ubuntu</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_tutorials/entry/using-solr-lucene-for-full-text-search-with-cubrid-database-on-ubuntu</guid>
                                    <description><![CDATA[<p><a target="_self" href="http://lucene.apache.org/solr/">Apache Solr</a> is one of the most popular full-text search engines currently available in the open source market. It is implemented in Java and runs as a standalone server within a servlet container such as Tomcat. More information about Solr is extensively provided on their official site.<br /></p><p>In this tutorial you will learn how to use Solr for full-text search with CUBRID Database. Even though below you will find installation instructions for Ubuntu, the examples can be used on other OS with the same success. If you have already completed some of the following steps on your own, you can skip them and move on.<br /></p><ol><li>[Installing CUBRID on Ubuntu|Install CUBRID on Ubuntu] (other [CUBRID Installation Instructions|OS])</li><li>[Install Apache Tomcat on Ubuntu]</li><li>[Install Apache Solr on Ubuntu]</li><li>[Create a sample CUBRID Database from the command line]<br /></li><li>[Full index of CUBRID Database using Solr DataImportHandler]<br /></li></ol><p><br /></p>]]></description>
                        <pubDate>Mon, 20 Feb 2012 02:18:17 -0800</pubDate>
                        <category>Solr</category>
                        <category>Lucene</category>
                        <category>full text search</category>
                        <category>CUBRID</category>
                        <category>ubuntu</category>
                                </item>
        										        <item>
            <title>Create a sample CUBRID Database from the command line</title>
            <dc:creator>CUBRID</dc:creator>
            <link>http://www.cubrid.org/wiki_tutorials/entry/create-a-sample-cubrid-database-from-the-command-line</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_tutorials/entry/create-a-sample-cubrid-database-from-the-command-line</guid>
                                    <description><![CDATA[<p>In this tutorial you will learn how to quickly create a database in CUBRID. If you use a Desktop version of the OS and prefer using GUI tools instead of a terminal, you may perform all of the commands below in <a target="_self" href="../../../../wiki_tools/entry/cm_manual_database">CUBRID Manager</a>.</p><p>To start with let's create a sample database. Type the following command in the terminal. This assumes that CUBRID is installed in your system (or see [CUBRID Installation Instructions|installation instructions]). If necessary, replace <span style="font-style: italic;">sample_db</span> with your own database name.<br /></p><p></p><div editor_component="code_highlighter" code_type="Bash" file_path="" description="" first_line="1" collapse="false" nogutter="true" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url('./modules/editor/components/code_highlighter/code.png') no-repeat top right;">cubrid createdb sample_db</div><p></p><p>This will create a database in your current working directory with a user <span style="font-weight: bold;">dba</span> and a blank password.</p><blockquote class="q4"><p>If you want to keep your databases in a certain directory, first navigate to that directory and then execute the above <span style="font-weight: bold;">createdb</span> command.<br /></p></blockquote><p>If you decided to use a command line terminal, you need to connect to
 a database to execute SQL queries. CUBRID provides CSQL command line 
SQL interpreter for this. Let's connect to a database.</p>
<p></p><div editor_component="code_highlighter" code_type="Plain" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url('./modules/editor/components/code_highlighter/code.png') no-repeat top right;">csql sample_db<br /><br />CSQL Interpreter<br /><br />Type `;help' for help messages.<br /><br />csql&gt;<br /></div>
<p></p>
<p>Now create a table to hold users' data. SQL in CUBRID is very much same to that of MySQL.<br /></p><p></p><div editor_component="code_highlighter" code_type="Sql" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url('./modules/editor/components/code_highlighter/code.png') no-repeat top right;">CREATE TABLE "tbl_users"(<br />&nbsp;&nbsp;&nbsp; "id" integer AUTO_INCREMENT,<br />&nbsp;&nbsp;&nbsp; "email" varchar(100) NOT NULL UNIQUE,<br />&nbsp;&nbsp;&nbsp; "join_date" integer NOT NULL,<br />&nbsp;&nbsp;&nbsp; CONSTRAINT pk_tbl_users_id PRIMARY KEY("id")<br />);</div><p></p><p>Copy and paste the above schema declaration in the CSQL and press Enter.</p><p>Now let's insert some data into the table using CSQL.</p><p></p><div editor_component="code_highlighter" code_type="Sql" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url('./modules/editor/components/code_highlighter/code.png') no-repeat top right;">INSERT INTO tbl_users (email, join_date) VALUES<br />('7hyn6@peg30xmw1hcdrcg.gov', 1328523265),<br />('29ggzm3@cexbebaju9pkrq.net', 1328534265),<br />('4yn69iqqe@rh6c5b28xaw.gov', 1328528265),<br />('dyku2b8@wzfofw5aqymu7.biz', 1323423265),<br />('7au9hv1u@boi1ba1wowlfj3m.org', 1328523665);</div><p>At this point you have learnt how to create a database and a table as well as insert sample data.<br /></p>]]></description>
                        <pubDate>Tue, 21 Feb 2012 00:38:54 -0800</pubDate>
                        <category>CSQL</category>
                        <category>CREATE TABLE</category>
                        <category>createdb</category>
                        <category>INSERT</category>
                        <category>SQL</category>
                                </item>
        										        <item>
            <title>Install Apache Solr on Ubuntu</title>
            <dc:creator>CUBRID</dc:creator>
            <link>http://www.cubrid.org/wiki_tutorials/entry/install-apache-solr-on-ubuntu</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_tutorials/entry/install-apache-solr-on-ubuntu</guid>
                                    <description><![CDATA[<p>Installing Apache Solr on Ubuntu is quite easy. In fact, it does not require any installation. All you will need to do is just download and extract the package. But before you proceed, make sure you have already [Install Apache Tomcat on Ubuntu|installed Tomcat] which is necessary to access Solr from the browser.<br /></p><p>To make further management of Solr server easy, we will first create a separate user for it.</p><p></p><div editor_component="code_highlighter" code_type="Bash" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url('./modules/editor/components/code_highlighter/code.png') no-repeat top right;">sudo adduser solr</div><p></p><p>You will be asked to enter a password for <span style="font-weight: bold;">solr</span> user as well as additional information which you can ignore by simply pressing Enter. Once done, login to this user. When password is prompted, enter the password you have just created.<br /></p><p></p><div editor_component="code_highlighter" code_type="Bash" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url('./modules/editor/components/code_highlighter/code.png') no-repeat top right;">su - solr</div><p></p><p>Once you are logged in, you will be in <span style="font-weight: bold;">/home/solr</span> directory.<br /></p><p>Now download the <a target="_self" href="http://www.apache.org/dyn/closer.cgi/lucene/solr">latest version of Apache Solr</a> from the official site. On that site you will be given a list of mirror sites to download the installation package. Click on one of them. You will see a list of several versions of Solr. Choose the latest one. Copy the URL of the file (<span style="font-weight: bold;">*.tgz</span>) and download it from the terminal as shown below.</p><p></p><div editor_component="code_highlighter" code_type="Bash" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url('./modules/editor/components/code_highlighter/code.png') no-repeat top right;">wget http://mirror.apache-kr.org/lucene/solr/3.5.0/apache-solr-3.5.0.tgz</div><p></p><p>Extract the package.</p><p></p><div editor_component="code_highlighter" code_type="Bash" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url('./modules/editor/components/code_highlighter/code.png') no-repeat top right;">tar xzf apache-solr-3.5.0.tgz</div><p></p><p>All files will be extracted to <span style="font-weight: bold;">apache-solr-3.5.0/</span> directory. This is all you need to continue to work with Solr. To configure Solr server to connect to a CUBRID Database, see the next tutorial.<br /></p>]]></description>
                        <pubDate>Mon, 20 Feb 2012 03:13:39 -0800</pubDate>
                        <category>Solr</category>
                        <category>installation instructions</category>
                        <category>ubuntu</category>
                                </item>
        										        <item>
            <title>CUBRID Migration Toolkit Installation_kr</title>
            <dc:creator>newpcraft</dc:creator>
            <link>http://www.cubrid.org/wiki_tools/entry/cubrid-migration-toolkit-installation_kr</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_tools/entry/cubrid-migration-toolkit-installation_kr</guid>
                                    <description><![CDATA[<h2>■ CUBRID 마이그레이션 툴킷 Client 설치하기</h2>

<p>CUBRID 마이그레이션 툴킷은 Java 실행 환경에서 실행이 가능하기 때문에 우선 JRE (Java Runtime Environment)를 설치해야 한다. JRE는 아래의 URL에서 다운로드 받을 수 있으며 다운로드 후 설치를 한다.</p><ul><li>JRE 다운로드 URL : <a target="_blank" href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Oracle Java Runtime Environment 다운로드</a></li></ul><p>※ Java SE 6 Update 30 (2012년 1월 현재 기준)에 해당하는 JRE를 다운로드 받아 설치한다.<br /></p><p><br /></p><p>CUBRID 마이그레이션 툴킷은 HTTP, FTP 두 가지 방식으로 다운로드가 가능하며, 아래의 다운로드 URL을 이용하여 CUBRID의 버전에 맞는 CUBRID 마이그레이션 툴킷을 다운로드 받는다.</p><p>참고로, CUBRID 버전이 8.4.1이면 CUBRID 마이그레이션 툴킷 역시 8.4.1 중 최신 빌드를 다운로드 받으면 된다.<br /></p>
<ul><li>CUBRID 마이그레이션 툴킷 다운로드 URL : <a target="_blank" href="../../../../?mid=downloads&amp;item=cubrid_migration_toolkit&amp;os=detect">HTTP</a> <a target="_blank" href="ftp://ftp.cubrid.org/CUBRID_Tools/CUBRID_Migration_Toolkit/">FTP</a></li></ul><p><br /></p>

<h2>■ CUBRID 마이그레이션 툴킷 Server 설치하기 (1.5 버전)<br /></h2>

<p>CUBRID 마이그레이션 툴킷은 Client와 Server로 구분된다. 일반적인 환경에서는 Client만으로 마이그레이션이 
가능하나 Remote Server에서 Remote Server로 빠른 속도로 마이그레이션을 하기 위해서는 CUBRID 마이그레이션
 툴킷 Server가 필요하다.</p><p>참고로 CUBRID Migration Toolkit 8.4.1 버전부터 CUBRID Migration Server는 더이상 지원하지 않는다.</p>

<h3>□ Windows 환경에서 설치 및 실행</h3>
<p>CMT 서버를 실행하려면 Java Runtime Environment(JRE) 1.6 이상 버전과 CUBRID 데이터베이스가 설치되어 있어야 한다.</p>

<p>Windows 환경에 CMT 서버를 설치하려면 ZIP 파일을 다운로드하여 압축을 해제하기만 하면 된다. 압축을 해제하면 CUBRID라는 디렉터리와 여러 개의 하위 디렉터리가 생성된다.</p>

<p>다운로드한 ZIP 파일을 압축 해제한 후에는 다음과 같은 방법으로 CMT 서버 관련 환경 변수인 CMT_HOME을 설정한다.</p>

<ol><li><span style="font-weight: bold;">|내 컴퓨터|</span>를 마우스 오른쪽 버튼으로 클릭하여 <span style="font-weight: bold;">|속성|</span>을 선택한다.</li><li><span style="font-weight: bold;">|시스템 속성|</span> 대화 상자에서 <span style="font-weight: bold;">|고급|</span> 탭을 선택한다.</li><li><span style="font-weight: bold;">|환경 변수|</span>를 클릭한다.</li><li><span style="font-weight: bold;">|시스템 변수|</span>에서 <span style="font-weight: bold;">|새로 만들기|</span>를 클릭한다.</li><li><span style="font-weight: bold;">|변수 이름|</span>에 CMT_HOME을 입력하고, <span style="font-weight: bold;">|변수 값|</span>에 {압축 해제한 디렉토리}CUBRIDcubridmigration_server를 입력한다. 만약 C:에 압축을 해제했다면 변수 값은 C:CUBRIDcubridmigration_server이다.</li></ol>

<h3>□ Linux 환경에서 설치 및 실행</h3>
<p>CMT 서버를 실행하려면 Java Runtime Environment(JRE) 1.6 이상 버전과 CUBRID 데이터베이스가 설치되어 있어야 한다.</p>
<p>Linux 환경에 CMT 서버를 설치하려면 tar.gz 파일을 다운로드하여 압축을 해제하기만 하면 된다. 압축을 해제하면 CUBRID라는 디렉터리와 여러 개의 하위 디렉터리가 생성된다.</p>
<p>다운로드한 tar.gz 파일을 압축 해제한 후에는 CMT 서버 관련 환경 변수인 CMT_HOME을 설정해야 한다. bash를
 사용한다면 .bashrc 파일에 다음과 같은 내용을 추가하여 환경 변수 CMT_HOME을 설정할 수 있다.</p>
<p><br /></p>

<blockquote class="q6">
<p class="codep">export CMT_HOME=/home/cubrid/CUBRID/cubridmigration_server</p>
<p class="codep">export PATH=$PATH:/home/cubrid/CUBRID/cubridmigration_server</p>
</blockquote>
<p><br /></p>

<p>.bashrc 파일을 수정한 후에는 다음 명령어를 실행하여 환경 변수를 업데이트한다.</p>
<blockquote class="q6"><p class="codep">. ~/.bashrc</p></blockquote>
<p><br /></p>

<p>환경 변수 CMT_HOME을 설정한 후에는 다음 명령어를 실행하여 CMT 서버를 시작할 수 있다.</p>
<blockquote class="q6"><p class="codep">./cmt_server start</p></blockquote>
<p><br /></p>

<p>CMT 서버를 중지하려면 다음 명령어를 실행한다.</p>
<blockquote class="q6"><p class="codep">./cmt_server stop</p></blockquote>
<p><br /></p>

<p>명령줄에서 ./cmt_server start 명령어로 CMT 서버를 시작하면, 환경 변수 CMT_HOME을 간편하게 설정할 수 있다.</p>]]></description>
                        <pubDate>Thu, 26 Jan 2012 19:45:12 -0800</pubDate>
                        <category>manual</category>
                        <category>CMT</category>
                                </item>
        										        <item>
            <title>Install Apache Tomcat on Ubuntu</title>
            <dc:creator>CUBRID</dc:creator>
            <link>http://www.cubrid.org/wiki_tutorials/entry/install-apache-tomcat-on-ubuntu</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_tutorials/entry/install-apache-tomcat-on-ubuntu</guid>
                                    <description><![CDATA[<p><a target="_self" href="http://tomcat.apache.org/">Apache Tomcat</a> is a Web container that allows to serve Java Servlets (such as [Using Solr / Lucene for full text search with CUBRID Database on Ubuntu|Solr full-text search server]) and JSP (Java Server Pages) Web applications. More information can be found on Tomcat official site.<br /></p><p>In this tutorial you will learn how to install Tomcat 7 on Ubuntu 11.10. To install Tomcat type the following command in the terminal.</p><p></p><div editor_component="code_highlighter" code_type="Bash" file_path="" description="" first_line="1" collapse="false" nogutter="false" nocontrols="false" style="border: #666666 1px dotted; border-left: #22aaee 5px solid; padding: 5px; background: #FAFAFA url('./modules/editor/components/code_highlighter/code.png') no-repeat top right;">sudo apt-get install tomcat7</div><p></p><p>This will install Tomcat on port 8080 (default) and autostart it. To see if installation went successfully, navigate to <a target="_self" href="http://localhost:8080">http://localhost:8080</a> in your browser. You should see a default page which displays "It works!".</p><p>To have Apache Solr work with Tomcat, you do not need to configure anything. Default settings will work out of the box. If necessary, you can refer to <a target="_self" href="https://help.ubuntu.com/11.04/serverguide/C/tomcat.html">Ubuntu Documentation for Tomcat</a>.<br /></p>]]></description>
                        <pubDate>Mon, 20 Feb 2012 02:41:23 -0800</pubDate>
                        <category>Tomcat</category>
                        <category>Java</category>
                        <category>Solr</category>
                        <category>ubuntu</category>
                                </item>
        										        <item>
            <title>CUBRID JDBC Compatibility</title>
            <dc:creator>CUBRID</dc:creator>
            <link>http://www.cubrid.org/wiki_apis/entry/cubrid-jdbc-compatibility</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_apis/entry/cubrid-jdbc-compatibility</guid>
                                    <description><![CDATA[<p>CUBRID JDBC&nbsp;driver&nbsp;complies to JDBC 2.0 specifications. It is available in different versions which are not backward compatible. If the driver&nbsp;has a version of&nbsp;<b>8.3.0.0337</b>, its full version is&nbsp;<b>CUBRID 200<span style="color: rgb(255, 0, 0); ">8</span>&nbsp;R<span style="color: rgb(255, 0, 0); ">3.0</span>&nbsp;built&nbsp;<span style="color: rgb(255, 0, 0); ">0337</span></b>, which means it is compatible with CUBRID 8.3.0.&nbsp;Users should link to&nbsp;<i>CUBRID version specific</i>&nbsp;<a target="_self" href="/?mid=downloads&amp;item=jdbc_driver">JDBC Driver</a> in their projects.</p>]]></description>
                        <pubDate>Thu, 05 Jan 2012 21:17:25 -0800</pubDate>
                        <category>jdbc</category>
                        <category>driver</category>
                        <category>compatibility</category>
                                </item>
        										        <item>
            <title>CUBRID JDBC Driver</title>
            <dc:creator>CUBRID</dc:creator>
            <link>http://www.cubrid.org/wiki_apis/entry/cubrid-jdbc-driver</link>
            <guid isPermaLink="true">http://www.cubrid.org/wiki_apis/entry/cubrid-jdbc-driver</guid>
                                    <description><![CDATA[<p>CUBRID JDBC driver (<b>cubrid_jdbc.jar</b>) enables the system to make a connection to the CUBRID database in an application written in Java. It comes bundled with CUBRID by default. The driver can be found in the <b>/jdbc</b>&nbsp;directory where CUBRID has been installed.</p><p>CUBRID JDBC driver has been developed based on the JDBC 2.0 specification and provides compilation output generated in JDK version 1.6.<br /></p>

<div class="grid col2">
                    <span><ul>
                        <li>[About CUBRID JDBC Driver]</li><li><a href="/?mid=downloads&amp;item=jdbc_driver" target="_self">Download</a></li><li>[Setting Java Environment PATH|Installation Instructions]</li><li>[CUBRID JDBC Tutorials|Latest News, Guides and Tutorials]</li><li><a href="/questions" target="_self">Questions&nbsp;and Answers</a></li>
                    </ul></span>
                    <span><ul>
                        <li><a href="/manual/840/en/JDBC%20API" target="_self">JDBC API Manual</a></li><li><a href="http://jira.cubrid.org/browse/APIS/component/10105" target="_self">JIRA Issue Tracker</a></li><li><a href="/wiki_apis/entry/cubrid-jdbc-clojars-maven-repository" target="_self">Clojars Maven Repository</a></li></ul></span></div><p>JDBC driver just like other CUBRID API libraries is&nbsp;distributed under the terms of&nbsp;<a href="/bsd_license" target="_self">BSD open source license</a>. In simple words BSD License gives users complete freedom over how they use the CUBRID APIs and their source code. The only requirement is not to claim for the ownership.</p>]]></description>
                        <pubDate>Thu, 05 Jan 2012 21:29:23 -0800</pubDate>
                        <category>jdbc</category>
                        <category>driver</category>
                                </item>
        										        <item>
            <title>CUBRID Q&amp;A Event</title>
            <dc:creator>CUBRID</dc:creator>
            <link>http://www.cubrid.org/forum/234138</link>
            <guid isPermaLink="true">http://www.cubrid.org/forum/234138</guid>
                                    <description><![CDATA[<p style="MARGIN-RIGHT: 0px" dir="ltr"><a href="/event_questions_answers" target="_self">CUBRID Q&amp;A Event</a> is about to start. If you have questions or would like to discuss about it, please leave your comments below.</p>]]></description>
                        <pubDate>Wed, 02 Nov 2011 02:14:56 -0800</pubDate>
                                </item>
        										        <item>
            <title>Kick off 미팅</title>
            <dc:creator>choi</dc:creator>
            <link>http://www.cubrid.org/forum/298897</link>
            <guid isPermaLink="true">http://www.cubrid.org/forum/298897</guid>
                                    <description><![CDATA[<p>과제 Kick OFF 미팅 </p>
<p>&nbsp;</p>
<p>* 일시: 2012년 1월 16일&nbsp; </p>
<p>* 참석자</p>
<p>&nbsp;&nbsp; - NHN Business: 진은숙 센터장 외 4명</p>
<p>&nbsp;&nbsp; -&nbsp;선재소프트: 김기완외 3명</p>
<p>&nbsp;&nbsp; - 아헴스: 서상원외 2명</p>
<p>&nbsp;&nbsp; - KAIST 이윤준 교수</p>
<p>&nbsp;&nbsp; - 큐브리드 정병주 대표</p>
<p>* 주제</p>
<p>&nbsp;&nbsp; 사업의 개요와 향후 추진 방향에 대한 설명 및 의견 공유</p>
<p>* 이슈 정리</p>
<p>&nbsp; &nbsp;- </p>]]></description>
                        <pubDate>Sun, 19 Feb 2012 17:29:13 -0800</pubDate>
                                </item>
        										        <item>
            <title>품질관리계획서</title>
            <dc:creator>choi</dc:creator>
            <link>http://www.cubrid.org/forum/298891</link>
            <guid isPermaLink="true">http://www.cubrid.org/forum/298891</guid>
                                    <description><![CDATA[<p>본 사업의 품질 관리 계획서입니다.</p>]]></description>
                        <pubDate>Sun, 19 Feb 2012 16:53:18 -0800</pubDate>
                                </item>
        										        <item>
            <title>사업계획서(Business Plan)</title>
            <dc:creator>choi</dc:creator>
            <link>http://www.cubrid.org/forum/298887</link>
            <guid isPermaLink="true">http://www.cubrid.org/forum/298887</guid>
                                    <description><![CDATA[<p>2011년 12월 NHN Busness Platform 이 제안한 Seed 형 플랫폼개발의 사업계획서 최종본 입니다.</p>]]></description>
                        <pubDate>Sun, 19 Feb 2012 16:52:01 -0800</pubDate>
                                </item>
            </channel>
</rss>

